Perl中的快速字符串校验和函数,生成0..2^32-1范围内的值
我正在寻找具有以下属性的Perl字符串校验和函数:Perl中的快速字符串校验和函数,生成0..2^32-1范围内的值,perl,string,checksum,cpan,hashcode,Perl,String,Checksum,Cpan,Hashcode,我正在寻找具有以下属性的Perl字符串校验和函数: 输入:未定义长度的Unicode字符串($string) 输出:无符号整数($hash),对于该整数,0不知道它有多快,但您可以尝试。任何哈希函数都足够-只需将其截断为4字节并转换为数字即可。好的散列函数有一个随机分布,无论在哪里截断字符串,这个分布都是恒定的 我之所以这样建议,是因为它是Perl作为标准提供的最快的散列实现。正如Pim提到的,CRC也是用C实现的,应该更快 下面是如何计算哈希并将其转换为整数: use Digest::MD5
- 输入:未定义长度的Unicode字符串(
)$string
- 输出:无符号整数(
),对于该整数,$hash
0不知道它有多快,但您可以尝试。任何哈希函数都足够-只需将其截断为4字节并转换为数字即可。好的散列函数有一个随机分布,无论在哪里截断字符串,这个分布都是恒定的 我之所以这样建议,是因为它是Perl作为标准提供的最快的散列实现。正如Pim提到的,CRC也是用C实现的,应该更快 下面是如何计算哈希并将其转换为整数:
use Digest::MD5 qw(md5); my $str = substr( md5("String-to-hash"), 0, 4 ); print unpack('L', $str); # Convert to 4-byte integer (long)
从perldoc-f解包
:
For example, the following computes the same number as the System V sum program: $checksum = do { local $/; # slurp! unpack("%32W*",<>) % 65535; };
您希望避免与所有可能的字符串发生冲突,但只有40亿个可能的摘要?为什么使用整数很重要?即使您必须将摘要存储为字符串,也可以使用MD5之类的工具,如何?“您希望避免与所有可能的字符串冲突”-不,如问题中所述,我只是“希望尽可能避免冲突”。“为什么使用整数很重要?”-如问题中所述,校验和将存储在“一个4字节的MySQL无符号整数“.B::hash还随core perl一起提供,使用内部core hash函数,速度比MD5快,并返回一个经过十六进制处理的32位整数。但是没有MD5那么安全。所有位的32位总和对于随机分布来说是一个非常糟糕的哈希值。任何哈希函数都更好,即使是最简单的。当然,但这和SystemV例如,下面计算的数字与 系统V和程序: $checksum=do{ 本地$/#咕噜声! 拆包(“%32W*”,)%65535; };
程序的问题是一样的。见该段。或者你是在争辩说,sum
可以说是坏的?在这种情况下,它与Perl无关。sum
的速度与您所能获得的速度一样快,尽管如上所述,它的健壮性不是很强。您可以通过使用大小来稍微改进它,例如sum
。任何需要更健壮的东西都应该使用$\;解包(“%32W*”,$)%65535。长度($)
或Digest::MD5
,等等。Digest::SHA
For example, the following computes the same number as the System V sum program: $checksum = do { local $/; # slurp! unpack("%32W*",<>) % 65535; };