Perl 5中的哈希随机化

Cha*_*ens 8 random perl hash

当Perl 5.8.1问世时,它添加了散列随机化.当Perl 5.8.2出来时,我想,除非存在环境变量(PERL_HASH_SEED),否则它会删除哈希随机化.现在好像我被严重误认为

PERL_HASH_SEED=$SEED perl -MData::Dumper -e 'print Dumper{map{$_,1}"a".."z"}'
Run Code Online (Sandbox Code Playgroud)

无论价值如何,始终都会重新启动相同的密钥排序$SEED.

哈希随机化完全消失了,我做错了什么,或者这是一个错误?

Mat*_*Mat 6

请参阅算法复杂性攻击:

在Perl 5.8.1中,散列函数被伪随机种子随机扰动,这使得生成这种淘气的散列密钥更加困难.[...]但是从5.8.2开始,如果内部检测到病理数据的插入,则仅用于个别哈希.

因此,只有当perl检测到需要时,才会发生随机化.

  • 来自`perlrun`:`默认情况下,大多数哈希返回的元素与Perl 5.8.0中的顺序相同.在基于散列的散列基础上,如果在散列键插入期间检测到病理数据,则该散列将切换到替代的随机散列种子. (3认同)
  • @Chas.欧文斯,即使种子生效,也绝不可靠.使用[List :: Util](http://search.cpan.org/perldoc?List::Util)的`shuffle` (3认同)