我需要为这种三元组实现某种设置数据结构: (int,int,int),其中前2个int来自未知范围,第3个int通常很小。我不需要任何有关订购的信息,所以我决定使用HashSet。我从来没有实现过类似的东西,但我读过它很容易搞砸,并且在使用它时表现不佳。
这是我打算做的事情。我制作了一大堆可调整大小的桶,并且(散列函数%大小)给出了将三元组放入的桶的数量。我知道我需要均匀地使用所有桶以使其高效。问题是:这样做的正确方法是什么? "(a + b + c)mod大小"效率还是我需要使用更复杂的东西?
答案 0 :(得分:3)
不要使用普通的散列函数,因为色散远非最佳,并且碰撞的概率很高。散列函数已经成为许多研究的对象,你应该首先从wikipedia page开始 - 为了你的用法,你应该考虑非加密函数。
如果不确定,通常认为FNV-1a哈希值是正确的(从维基百科中提取):
hash = FNV_offset_basis
for each byte_of_data to be hashed
hash = hash XOR byte_of_data
hash = hash × FNV_prime
return hash
如果你想要32位哈希值,则素数为2 24 + 2 8 + 0x93 = 16777619
有趣的是,该产品可以写成少量的转移和添加:
hval += (hval<<1) + (hval<<4) + (hval<<7) + (hval<<8) + (hval<<24);
重新说明:FNV Hash