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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值