我正在寻找一个将多组整数映射到整数的函数,希望它具有成对独立性等某种保证.
理想情况下,内存使用量将保持不变,并且哈希值可以在插入/删除后的O(1)时间内更新.(这禁止执行诸如排序整数和使用哈希函数之类的操作,如h(x)= h_1(x_1,h_2(x_2,h_3(x_3,x_4))).)
XORing哈希值不起作用,因为h({1,1,2})= h({2})
我认为如果底层哈希函数具有不切实际的强保证(例如n独立性),则将模数乘以模数可能会起作用.
给定一组整数,一个“功能组”,是否有更好的方法来获取整数的 GetHashCode,其中数字的位置不影响哈希?
void Main()
{
int[] ints = { 10001, 10002, 10003, 10004, 10005 };
int hash = GetHashCode(ints);
Console.WriteLine("hash={0}", hash);
}
int GetHashCode(IEnumerable<int> integers)
{
IEnumerator<int> intEnum = integers.GetEnumerator();
if(intEnum.MoveNext()==false) return 0;
int hash = 0;
unchecked {
hash = intEnum.Current.GetHashCode();
for(;intEnum.MoveNext()==true;)
hash = 31 * hash + intEnum.Current.GetHashCode();
}
return hash;
}
Run Code Online (Sandbox Code Playgroud)
这个输出是:hash=954101523 如果我交换 10003 和 10002 我得到:hash=954130353
除了在获取散列之前对列表进行排序之外,如果列表位置中的项目发生变化,是否有更好的选择不会改变?
整数列表基本上代表一组作为“功能组”的记录 ID,因此“功能组”实际上是关键,而不是真正依赖于顺序