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

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

发布时间:2020-12-16 00:20:29 所属栏目:大数据 来源:网络整理
导读:关于饱和运算请百度一下即可。 最近需要将字符串hash成数字,在网上搜了一下,发现BKDRHash算法是效率最高、冲突较少的算法,于是乎试图将C代码的该算法移植到PERL下,结果发现在PERL下,默认是饱和运算……这可不行,因为该算法就是不停的计算,如果是饱和

关于饱和运算请百度一下即可。 最近需要将字符串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);

(编辑:李大同)

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

    推荐文章
      热点阅读