我有一个4维Point类,其中4个值中的每一个都是从0到大约1000的整数,因此这样一个Point上的散列函数会返回0到1000 ^ 4之间的值,因此需要40位如果我的数学是正确的。但是,我必须覆盖的GetHashCode方法(散列函数)只能返回32位整数;对于40位整数来说还不够。
我的最终目标是使用HashSet检查列表中的重复4D点,方法是检查列表中的所有4D点并将它们添加到HashSet中(如果该索引处已有元素,则该点已经被查看,是重复的)。 这意味着散列集中的索引数量与散列点的值相同,即1000 ^ 4个不同的索引。
将放入哈希集的实际点数最多为8,000。每次尝试将一个点插入到哈希集中时,预计会发生0或1次冲突(从不再发生冲突)。
请原谅我对HashSets的误解。我对算法的运行时间不太感兴趣,但我正在试验看它的“大哦”时间成本有多低。
答案 0 :(得分:2)
如果您覆盖Equals
,则HashSet
仍会确保唯一性。散列本质上是一种优化,因此它不必比较集合中的每个元素。
除非您对程序运行速度有具体要求,否则您可以使用这样的简单GetHashCode
实现:
int GetHashCode()
{
return Tuple.create(this.a, this.b, this.c, this.d).GetHashCode();
}
如果您已经尝试过但仍然不够(或者您这样做是为了好玩),那么您可以尝试使用long来创建自己的哈希集实现。
答案 1 :(得分:0)
HashSet
将进一步减少散列中的位数,因此
只需返回一个32位哈希码,并确保您的相等比较函数(override bool object.Equals(object)
)正常工作。当哈希匹配时,HashSet
将进行相等性检查,以便处理哈希冲突。