Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用异或移位作为更快的CRC32校验和?_Java_Hash_Checksum_Crc32 - Fatal编程技术网

Java 使用异或移位作为更快的CRC32校验和?

Java 使用异或移位作为更快的CRC32校验和?,java,hash,checksum,crc32,Java,Hash,Checksum,Crc32,使用XOR shift生成可用校验和是否有效?我找不到比CRC32更能说明碰撞的证据 我确实在1000万个随机生成的8到32长度字节数组上运行了一个模拟,下面的hash32方法实际产生的冲突比CRC32少2% 此外,代码的运行速度似乎比Java的内置util.zip.CRC32类快40倍左右 public static long hash64( byte[] bytes ) { long x = 1; for ( int i = 0; i < bytes.lengt

使用XOR shift生成可用校验和是否有效?我找不到比CRC32更能说明碰撞的证据

我确实在1000万个随机生成的8到32长度字节数组上运行了一个模拟,下面的hash32方法实际产生的冲突比CRC32少2%

此外,代码的运行速度似乎比Java的内置util.zip.CRC32类快40倍左右

public static long hash64( byte[] bytes )
    {
    long x = 1;
    for ( int i = 0; i < bytes.length; i++ )
        {
        x ^= bytes[ i ];
        x ^= ( x << 21 );
        x ^= ( x >>> 35 );
        x ^= ( x << 4 );
        }

    return x;
    }


public static int hash32( byte[] bytes )
    {
    int x = 1;
    for ( int i = 0; i < bytes.length; i++ )
        {
        x ^= bytes[ i ];
        x ^= ( x << 13 );
        x ^= ( x >>> 17 );
        x ^= ( x << 5 );
        }

    return x;
    }
公共静态长哈希64(字节[]字节)
{
长x=1;
for(int i=0;i>35);
x^=(x>17);

x^=(x是的,如果您只需要一个简单的文件校验和,那么它是一个完全有效的替代方案,但不是最好的解决方案

CRC是为可靠检测而优化的,而不是为了抗冲突或均匀分布。CRC-32表面上看起来可能是一个通用哈希函数或校验和函数,但是,正如您在测试中所看到的那样。CRC也非常慢,因为它必须实现多项式除法,这需要昂贵的操作,即使在经过大量优化的情况下也是如此使用查找表(LUT)的CRC的表版本在解释语言(如Java)中也很慢,因为每次查找都不可避免地进行边界检查和条件检查

您的解决方案是采用Xorshift,一种伪随机函数(PRF),并将其转换为哈希函数。表面上看,这似乎通过了基本的碰撞测试,但这不是一个很好的选择。它的雪崩行为非常差,因此存在着比你的测试灵敏度不够高的碰撞概率。不仅如此,它是次优的,一次只能读取一个字节一段时间。存在性能相当的更好的解决方案


一个更好的选择是,当充分优化后,它在Java中的性能相当好。对于大输入,它甚至可能比您的解决方案更快。我还建议阅读。它解释了如何以易于理解的方式构造和测试哈希函数。

`x^=(x>>>35)你喜欢箭头……这是什么语言?是的,我喜欢箭头。它是Java。