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

Perl中的快速字符串校验和函数生成0..2 ^ 32-1范围内的值

发布时间:2020-12-15 22:02:52 所属栏目:大数据 来源:网络整理
导读:我正在寻找具有以下属性的Perl字符串校验和函数: 输入:未定义长度的Unicode字符串($string) 输出:无符号整数($hash),0 = $hash = 2 ^ 32-1成立(0到4294967295,匹配4字节MySQL unsigned int的大小) 伪代码: sub checksum { my $string = shift; my $hash;
我正在寻找具有以下属性的Perl字符串校验和函数:

>输入:未定义长度的Unicode字符串($string)
>输出:无符号整数($hash),0 <= $hash <= 2 ^ 32-1成立(0到4294967295,匹配4字节MySQL unsigned int的大小)

伪代码:

sub checksum {
    my $string = shift;
    my $hash;
    ... checksum logic goes here ...
    die unless ($hash >= 0);
    die unless ($hash <= 4_294_967_295);
    return $hash;
}

理想情况下,校验和函数应该快速运行,并应在目标空间(0 .. 2 ^ 32-1)中均匀地生成值,以避免碰撞.在这个应用程序中,随机碰撞是完全不致命的,但显然我想避免它们在可能的程度上.

考虑到这些要求,解决这个问题的最好办法是什么?

解决方法

任何哈希函数都将是足够的 – 简单地将其截断为4字节并转换为一个数字.好的哈希函数有一个随机分布,无论你截断字符串的位置,这个分布将是常数.

我建议Digest::MD5因为它是Perl作为标准配置中最快的哈希实现. String :: CRC,作为Pim提到,也在C中实现,应该更快.

以下是计算哈希值并将其转换为整数的方法:

use Digest::MD5 qw(md5);
my $str = substr( md5("String-to-hash"),4 );
print unpack('L',$str);  # Convert to 4-byte integer (long)

(编辑:李大同)

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

    推荐文章
      热点阅读