perl – 为什么每次运行程序时,从常量列表创建的哈希“以不同的顺序”?

前端之家收集整理的这篇文章主要介绍了perl – 为什么每次运行程序时,从常量列表创建的哈希“以不同的顺序”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下面是Perl中的小脚本.每次运行此代码时,我都会得到不同的输出.

任何人都可以帮助我理解哈希变量的存储基础知识,即如何为Perl的哈希变量的键值对进行索引.

#!/usr/bin/perl

%data = ('John Paul' => 45,'Lisa' => 30,'Kumar' => 40);
@names = keys %data;
print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";

解决方法

该行为记录在 perlsecAlgorithmic Complexity Attacks中.

哈希是链表的数组.散列函数将密钥转换为一个数字,该数字用作存储值的数组元素(“bucket”)的索引.多个密钥可以散列到相同的索引(“冲突”),这是由链表处理的情况.

如果恶意用户知道散列算法,他可以设计散列到同一索引的值,从而导致散列退化为链接列表.这可能会导致某些应用程序性能大幅下降,因此可用作拒绝服务(DoS)攻击的一部分.

采取了两项措施来避免这种情况.一种方法是使散列算法加盐以随机化存储元素的顺序,另一种方法是通过扰乱迭代器访问散列元素的顺序来更难检测盐.

$perl -E'
   my @k = "a".."z";
   for (1..3) {
      my %h = map { $_ => 1 } @k;
      say keys %h;
   }
'
iocmbygdkranwxfejuqpzvltsh
bmcoigdywrankujfxezpqlvths
juexfwarnkgdybmcoihstlvzpq

猜你在找的Perl相关文章