加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:34:59 所属栏目:大数据 来源:网络整理
导读:下面是Perl中的小脚本.每次运行此代码时,我都会得到不同的输出. 任何人都可以帮助我理解哈希变量的存储基础知识,即如何为Perl的哈希变量的键值对进行索引. #!/usr/bin/perl%data = ('John Paul' = 45,'Lisa' = 30,'Kumar' = 40);@names = keys %data;print "
下面是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";

解决方法

该行为记录在 perlsec的 Algorithmic Complexity Attacks中.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读