使用 Perl,不使用 ActivePerl 不附带的任何额外模块,如何创建从 0-F 的 8 个字符的字符串。例子0F1672DA
?填充应该是可控的,最好是 8 个字符。
我想生成的字符串类型的更多示例:
28DA9782
55C7128A
使用 Perl,不使用 ActivePerl 不附带的任何额外模块,如何创建从 0-F 的 8 个字符的字符串。例子0F1672DA
?填充应该是可控的,最好是 8 个字符。
我想生成的字符串类型的更多示例:
28DA9782
55C7128A
原则上,你应该能够做到
#!/usr/bin/env perl
use strict; use warnings;
for (1 .. 10) {
printf "%08X\n", rand(0xffffffff);
}
但是,您可能会发现——至少在某些带有一些perl
s(如果不是全部)的系统上—— 的范围rand
被限制为 32,768 个值。
您还可以研究String::Random的源代码,了解如何生成满足其他条件的随机字符串。
但是,我对使用内置rand
Windows 系统的警告仍然存在。有关高质量 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:Perl 在 Windows 上的 rand 问题在 5.20 中得到修复:
这意味着 perl 随机数的质量会因平台而异,从 Windows 上的 15 位 rand() 到 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))
有些人提到 rand 的 windows 限制和 rand(0x7FFF) 或 rand(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) )
);
但我认为这只是学术性的,因为它确实是难以理解的笨拙代码。
我不会在实际代码中使用它,只有在速度最重要的情况下。
但也许它是最快的解决方案,它展示了一种模式来克服 Windows 下 rand() 函数的限制......
用于sprintf
将数字转换为十六进制。
$foo .= sprintf("%x", rand 16) for 1..8;