我正在寻找具有以下属性的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)