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

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

我正在寻找具有以下属性的Perl字符串校验和函数:

  • 输入:未定义长度的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;
                };
    
    例如,下面计算的数字与
    系统V和程序:
    $checksum=do{
    本地$/#咕噜声!
    拆包(“%32W*”,)%65535;
    };
    
    您希望避免与所有可能的字符串发生冲突,但只有40亿个可能的摘要?为什么使用整数很重要?即使您必须将摘要存储为字符串,也可以使用MD5之类的工具,如何?“您希望避免与所有可能的字符串冲突”-不,如问题中所述,我只是“希望尽可能避免冲突”。“为什么使用整数很重要?”-如问题中所述,校验和将存储在“一个4字节的MySQL无符号整数“.B::hash还随core perl一起提供,使用内部core hash函数,速度比MD5快,并返回一个经过十六进制处理的32位整数。但是没有MD5那么安全。所有位的32位总和对于随机分布来说是一个非常糟糕的哈希值。任何哈希函数都更好,即使是最简单的。当然,但这和SystemV
    sum
    程序的问题是一样的。见该段。或者你是在争辩说,
    sum
    可以说是坏的?在这种情况下,它与Perl无关。
    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;
                };