如何允许散列函数为HashSet返回64位整数

时间:2018-01-23 00:41:41

标签: c# hash hashset

我有一个4维Point类,其中4个值中的每一个都是从0到大约1000的整数,因此这样一个Point上的散列函数会返回0到1000 ^ 4之间的值,因此需要40位如果我的数学是正确的。但是,我必须覆盖的GetHashCode方法(散列函数)只能返回32位整数;对于40位整数来说还不够。

我的最终目标是使用HashSet检查列表中的重复4D点,方法是检查列表中的所有4D点并将它们添加到HashSet中(如果该索引处已有元素,则该点已经被查看,是重复的)。 这意味着散列集中的索引数量与散列点的值相同,即1000 ^ 4个不同的索引。

将放入哈希集的实际点数最多为8,000。每次尝试将一个点插入到哈希集中时,预计会发生0或1次冲突(从不再发生冲突)。

请原谅我对HashSets的误解。我对算法的运行时间不太感兴趣,但我正在试验看它的“大哦”时间成本有多低。

2 个答案:

答案 0 :(得分:2)

如果您覆盖Equals,则HashSet仍会确保唯一性。散列本质上是一种优化,因此它不必比较集合中的每个元素。

除非您对程序运行速度有具体要求,否则您可以使用这样的简单GetHashCode实现:

int GetHashCode()
{
  return Tuple.create(this.a, this.b, this.c, this.d).GetHashCode();
}

如果您已经尝试过但仍然不够(或者您这样做是为了好玩),那么您可以尝试使用long来创建自己的哈希集实现。

答案 1 :(得分:0)

你有2 ^ 64的内存吗?哈希代码应该将对象映射到足够小的数组以适合内存。 (HashSet将进一步减少散列中的位数,因此

只需返回一个32位哈希码,并确保您的相等比较函数(override bool object.Equals(object))正常工作。当哈希匹配时,HashSet将进行相等性检查,以便处理哈希冲突。