PERL下防止饱和运算(超过最大值自动翻转)

PERL下防止饱和运算(超过最大值自动翻转),第1张

概述关于饱和运算请百度一下即可。 最近需要将字符串hash成数字,在网上搜了一下,发现BKDRHash算法是效率最高、冲突较少的算法,于是乎试图将C代码的该算法移植到PERL下,结果发现在PERL下,默认是饱和运算……这可不行,因为该算法就是不停的计算,如果是饱和运算,当字符串太长之后,算出来的hash值就不会变了,始终是0XFFFFFFFF(如果是64位的机器,会是另外一个值),这就造成字符串的长度

关于饱和运算请百度一下即可。 最近需要将字符串hash成数字,在网上搜了一下,发现BKDRHash算法是效率最高、冲突较少的算法,于是乎试图将C代码的该算法移植到PERL下,结果发现在PERL下,默认是饱和运算……这可不行,因为该算法就是不停的计算,如果是饱和运算,当字符串太长之后,算出来的hash值就不会变了,始终是0XFFFFFFFF(如果是64位的机器,会是另外一个值),这就造成字符串的长度有限制,不满足要求。 最后在网上搜索良久,发现只要用use integer即可解决该问题,有关usr integer,可以参考:http://docstore.mik.ua/orelly/perl4/prog/ch31_11.htm 只要在你想开始用的地方加上use integer,然后在结束的时候用no integer,就可以啦! use warnings; sub BKDRHash() {     my $str = shift;     my $seed = 31;     my $hash = 0;     my $lengthofstr = length($str);     my $i = 0;      use integer;      for (;$i < $lengthofstr; $i++)     {         my $j;         $j = $i + 1;         my $temp = substr($str,$i,$j);         $hash = $hash * $seed + ord($temp);     }     print $hash; no integer;     #$hash = $hash & 0x7FFFFFFF; } my $param = shift; &BKDRHash($param);

总结

以上是内存溢出为你收集整理的PERL下防止饱和运算(超过最大值自动翻转)全部内容,希望文章能够帮你解决PERL下防止饱和运算(超过最大值自动翻转)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1283038.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存