在Perl中,如何生成由八个十六进制数字组成的随机字符串?
使用Perl,无需使用任何不带有ActivePerl的附加模块,如何从0-F创建8个字符的字符串。示例0F1672DA
?填充应该是可控的,正好8个字符是可取的。种串的在Perl中,如何生成由八个十六进制数字组成的随机字符串?
更多的例子我想生成:
28DA9782
55C7128A
原则,你应该能够做到
#!/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]
一般例如,允许任何字符范围:
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下的局限性的模式......
根据@Sinan,这不起作用。兰特的范围只有32,768! – unixman83 2012-04-26 15:49:08
我的声明有点弱:*至少在某些Windows系统中,“rand”的范围可能被限制为32,768个值。 – 2012-04-26 15:54:15
是的,我参与了博客。 – 2012-04-26 18:07:44
Golf:'perl -e'print [0..9,A..F ] - > [rand 16] for 1..8'' – daxim 2012-04-26 15:42:33
为什么downvoting?我确实需要学习编程。如果不是这些问题,什么是stackoverflow? – unixman83 2012-04-26 15:44:58
我没有投票你的帖子。但是,一般来说,排除任何CPAN模块并不受欢迎。此外,您需要努力寻找自己的解决方案,并寻求帮助,而不是期待别人给你罐装解决方案。 – 2012-04-26 15:51:55