Hash 是否';混合';创建64位哈希的32位哈希的结果是否有任何值?

Hash 是否';混合';创建64位哈希的32位哈希的结果是否有任何值?,hash,Hash,例如,如果您使用Java编程,并且希望为任意对象创建一个64位哈希函数,那么对object.hashCode()的结果应用类似于Hash3的“finalizer”的内容是否有意义 具体来说,是以下哈希函数 long Mix(int i) { long result = i; return result ^ (result << 32) ^ (result << 33); // Or some 'better' way of mixing up the bi

例如,如果您使用Java编程,并且希望为任意对象创建一个64位哈希函数,那么对object.hashCode()的结果应用类似于Hash3的“finalizer”的内容是否有意义

具体来说,是以下哈希函数

long Mix(int i)
{
    long result = i;
    return result ^ (result << 32) ^ (result << 33); // Or some 'better' way of mixing up the bits of i.
}

long Hash(Object o)
{
    return Mix(o.hashCode());
}
(我很清楚,第二个函数在32位散列上没有任何结果)

散列将用于实现(递归)散列联接,而存储桶将通过执行
散列%prime
来确定。令人担忧的是,如果我们只有32位开始,就很难为“递归”部分生成一个良好的独立哈希函数序列

我认为答案是否定的,你真的需要从一个64位的散列开始,它是直接从对象的值计算出来的


我想一个附带的问题是,为了哈希连接的目的,您首先是否需要64位哈希。

两个32位值要么相同,要么不同。你不能让它们完全相同:)32位值的最佳32位(或更长)散列是值本身。你不需要散列来进行连接-使用散列表只是一种方法-你也可以使用嵌套循环来创建连接,例如。但特别是对于复杂的键,与其他方法相比,散列连接通常是非常有效的。是的,我们将有一个回退到嵌套循环的方法,但是大多数关于散列连接的描述都谈到在bucket过大的情况下使用不同的散列函数进行递归散列连接,所以这就是我们所考虑的。
long Hash(Object o)
{
    return o.hashCode();
}