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

前端之家收集整理的这篇文章主要介绍了Perl中的快速字符串校验和函数生成0..2 ^ 32-1范围内的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找具有以下属性的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)

猜你在找的Perl相关文章