是否可以使用Hashcodes作为位掩码来有效地存储/跟踪集合成员资格?

时间:2016-06-20 18:30:17

标签: c# .net hashcode hashset bitmask

目前,我有一个解决方案,通过Object.GetHashCode获取哈希码然后将其存储在HashSet<int>中,跟踪我感兴趣的对象。

但是,我也一直在学习bitmasks和bitwise操作,我对他们非常感兴趣。 Here is a great question我发现了接近我要做的事情。但是,我似乎无法使哈希码有效地工作。

There is also this question,但当哈希码为int(32位)时,它似乎处理5位数。

我确实得到BitArray解决方案(来自第一个引用的问题),但它没有我当前的HashSet方法那么快。这是因为BitArray中需要创建的项目数量足以计算所有已知哈希码(int.MaxValue)。

在使用BitArray进行此工作时,是否应该考虑使用位掩码/按位操作?或者我完全不在这里,应该坚持我的HashSet<int>解决方案?

1 个答案:

答案 0 :(得分:0)

这确实是一个走出人迹罕至的道路的例子,与对参考/内存管理的误解相结合。在我的例子中,我使用<div class="i_have_an_image"> <img src="http://www.fillmurray.com/460/300" alt=""> <h2>I appear on top of the image, but aligned along the bottom</h2> </div>对象来存储来自实例上的方法调用的缓存结果。我无法使用Dictionary<TKey, TValue>,因为密钥至少有三个部分:

  1. 包含缓存结果的方法的实例。
  2. 所述方法。
  3. 传递给方法的参数。
  4. 如果我使用ConditionalWeakTable我将不得不创建“​​又一个对象”(类),这将需要另一个分配,但更糟糕但不会被任何东西引用(除了ConditionalWeakTable)并且会在第一次传递时收集垃圾(这确实是related to another open -- but now also solved -- question of mine)。

    经过深思熟虑后,我意识到答案确实存在于ConditionalWeakTable中。不是将上面的3个项目用作关键字,而是使用由第1部分和第2部分组成的ConditionalWeakTable,然后将Delegate与之配对。

    或者作为字段初始化:

    Dictionary

    (另外值得注意的是使用StructuralEqualityComparer和上面的词典来完成这项工作。)

    这当然可以满足我的一切需求。它将跟踪对象,直到从内存中清除包含该方法(并且包含readonly ConditionalWeakTable<Delegate, Dictionary<object[], object>> cache = new ConditionalWeakTable<Delegate, Dictionary<object[], object>>(); 的方法)的引用对象。此时,缓存的字典也将被释放,清除其所有内容。