在Perl中,如何生成由八个十六进制数字组成的随机字符串?

在Perl中,如何生成由八个十六进制数字组成的随机字符串?

问题描述:

使用Perl,无需使用任何不带有ActivePerl的附加模块,如何从0-F创建8个字符的字符串。示例0F1672DA?填充应该是可控的,正好8个字符是可取的。种串的在Perl中,如何生成由八个十六进制数字组成的随机字符串?

更多的例子我想生成:

28DA9782 
55C7128A 
+5

Golf:'perl -e'print [0..9,A..F ] - > [rand 16] for 1..8'' – daxim 2012-04-26 15:42:33

+1

为什么downvoting?我确实需要学习编程。如果不是这些问题,什么是*? – unixman83 2012-04-26 15:44:58

+4

我没有投票你的帖子。但是,一般来说,排除任何CPAN模块并不受欢迎。此外,您需要努力寻找自己的解决方案,并寻求帮助,而不是期待别人给你罐装解决方案。 – 2012-04-26 15:51:55

原则,你应该能够做到

#!/usr/bin/env perl 

use strict; use warnings; 

for (1 .. 10) { 
    printf "%08X\n", rand(0xffffffff); 
} 

然而,你可能会发现,—至少在某些系统上有一些perl秒(如果不是全部)—的range of rand is restricted to 32,768 values

您还可以学习String::Random的源代码,以了解如何生成满足其他条件的随机字符串。

但是,我反对在Windows系统上使用内置于rand的警告依然存在。有关高质量的RNG,请参见Math::Random::MT

#!/usr/bin/env perl 

use strict; use warnings; 

my @set = ('0' ..'9', 'A' .. 'F'); 
my $str = join '' => map $set[rand @set], 1 .. 8; 
print "$str\n"; 

PS:The issue with Perl's rand on Windows was fixed in 5.20

这意味着Perl的随机数的质量将因平台不同,从Windows兰特()的15位上的POSIX平台48位如带有drand48()的Linux。

Perl现在在所有平台上都使用自己的内部drand48()实现。这不会使perl的rand在密码上安全。 [perl的#115928]

+0

肯定有一个插件与ActivePerl来克服'rand'的限制? – unixman83 2012-04-26 15:40:34

+0

+1的'rand'警告 – unixman83 2012-04-26 15:41:17

+1

解决方案一次只能使用'rand'作为1位数吗?你的第二个例子是否这样做? – unixman83 2012-04-26 15:43:57

使用sprintf到数字转换为十六进制。

$foo .= sprintf("%x", rand 16) for 1..8; 
+0

+1简单 – unixman83 2012-04-26 15:43:35

一般例如,允许任何字符范围:

my @chars = ('0'..'9', 'A'..'F'); 
my $len = 8; 
my $string; 
while($len--){ $string .= $chars[rand @chars] }; 
print "$string\n"; 

sprintf("%08X", rand(0xFFFFFFFF)) 

有人提到与MAX-值兰特(0x7FFF的)兰特的窗口限制或兰特(32768)小数,我会用二进制移运营商“< <”

# overcomes the windows-rand()-only-works-with-max-15bit-(32767)-limitation: 
# needed 8*4==32bit random-number: 
#  first get the 15 high-significant bits shift them 17bits to the left, 
#  then the next 15bits shifted 2 bits to the left, 
#  then the last 2 bits with no shifting: 
printf('%08X', (
    (rand(0x8000)<<17) + (rand(0x8000)<<2) + rand(0b100)) 
    ); 

克服,但我在考虑这个因为它是非常难以理解的尴尬代码。
我不会在现实生活中使用这个代码,只有速度最快。
但也许它是最快的解决方案,它展示了一个克服rand()函数在windows下的局限性的模式......

+0

根据@Sinan,这不起作用。兰特的范围只有32,768! – unixman83 2012-04-26 15:49:08

+3

我的声明有点弱:*至少在某些Windows系统中,“rand”的范围可能被限制为32,768个值。 – 2012-04-26 15:54:15

+0

是的,我参与了博客。 – 2012-04-26 18:07:44