【发布时间】:2016-06-20 18:30:17
【问题描述】:
目前我有一个解决方案,通过Object.GetHashCode 获取它们的哈希码,然后将它们存储在HashSet<int> 中,我可以跟踪我感兴趣的对象。
不过,我也一直在学习位掩码和位运算,我对它们很感兴趣。 Here is a great question 我发现这与我想做的事情很接近。但是,对于哈希码,我似乎无法有效地进行这项工作。
There is also this question,但是当哈希码是int(32 位)时,它似乎可以处理 5 位数字。
我确实得到了BitArray 解决方案(来自第一个引用的问题),但它没有我目前的 HashSet 方法那么快。这是因为BitArray 中的项目数量庞大,需要创建这些项目以说明所有已知的哈希码 (int.MaxValue)。
在使用BitArray 进行这项工作时,我应该考虑一些位掩码/按位操作吗?还是我在这里完全偏离了常规,应该坚持我的HashSet<int> 解决方案?
【问题讨论】:
-
请不要使用 gethashcode,很容易发生冲突! stackoverflow.com/questions/7968753/…
-
您应该将对象本身存储在
HashSet中,而不是存储它们的GetHashCode值。通过仅存储哈希值,您可以消除HashSet管理冲突的能力。至于问题的其余部分,它基于散列对于每个对象都是唯一的前提,但这是一个错误的假设,所以你不能这样做。只需将项目放入HashSet。 -
@Servy 这是一个很好的观点,你让我在这里重新考虑我的设计。我希望存储信息而不必在内存中创建对对象的强引用并使其尽可能快。听起来我已经找到了解决方案(只要确保我找到了!)。
-
@Mike-EEE 您可以创建对它的弱引用,但要不完全引用它,您需要让它生成一个已知对该对象始终唯一的值,这将永不碰撞。
GetHashCode不会那样做;它需要提供一些其他更强大的散列形式。 -
@Servy 正确。问题(据我所知)是这些对象也可以是结构,它们不适用于
WeakReference,或者至少不适用于WeakReference<T>。我会考虑更多。
标签: c# .net hashcode hashset bitmask