首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Perl中,如何生成由八位十六进制数字组成的随机字符串?

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

Stack Overflow用户
提问于 2012-04-26 23:33:09
回答 4查看 22.9K关注 0票数 11

使用Perl,不使用任何不带ActivePerl的额外模块,我如何从0-F创建一个8个字符的字符串?示例0F1672DA?填充应该是可控的,最好是恰好8个字符。

我想要生成的字符串类型的更多示例:

代码语言:javascript
运行
复制
28DA9782
55C7128A
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-26 23:39:34

原则上,你应该能够做到

代码语言:javascript
运行
复制
#!/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系统上,-at至少是最低的。

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

然而,我对在Windows系统上使用内置rand的警告仍然成立。要获得高质量的RNG,请参阅Math::Random::MT

代码语言:javascript
运行
复制
#!/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位rand()到POSIX平台上的48位,比如带有drand48()的Linux。

Perl现在在所有平台上都使用自己的内部drand48()实现。这并不能保证perl的rand的加密安全。perl #115928

票数 19
EN

Stack Overflow用户

发布于 2012-04-26 23:40:05

通用示例,允许任意范围的字符:

代码语言:javascript
运行
复制
my @chars = ('0'..'9', 'A'..'F');
my $len = 8;
my $string;
while($len--){ $string .= $chars[rand @chars] };
print "$string\n";
票数 11
EN

Stack Overflow用户

发布于 2012-04-26 23:40:51

代码语言:javascript
运行
复制
sprintf("%08X", rand(0xFFFFFFFF))

有些人提到了rand的窗口限制与rand(0x7FFF)或rand(32768)的十进制的最大值,我将用二进制移位运算符'<<‘来克服这个问题。

代码语言:javascript
运行
复制
# 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()-function的限制……

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10336660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档