Hash-consing包括在内存中只保留给定对象的一个副本;也就是说,如果两个对象在语义上是相等的(相同的内容),那么它们应该在物理上是相等的(在内存中的相同位置)。该技术通常通过保持全局哈希集并仅在它们不等于哈希集中的对象时才创建新对象来实现。
一个额外的要求是,如果哈希表中的对象没有被哈希表之外的任何东西引用,则它们应该是可收集的;否则,哈希表应该包含弱引用。
由于需要恒定的时间,因此问题更加复杂,因此需要进行浅层、散列和相等测试;因此,对象具有唯一标识符,当将新对象添加到表中时,该标识符会递增。
我有一个工作实现,它使用System.Collections.Generic.Dictionary<key, node>
wherekey
是一个元组,给出节点的浅层摘要(适用于默认散列和相等测试)并且node
是对象。唯一的问题是Dictionary
对节点的强引用!
我可以使用Dictionary
to WeakReference
,但这不会释放指向悬空引用的键。
有些人提倡使用System.Runtime.CompilerServices.ConditionalWeakTable
,但这个类似乎做相反的事情:它在收集键时释放值,而我需要在收集值时释放键。
可以尝试使用System.Runtime.CompilerServices.ConditionalWeakTable<node, node>
,但我需要自定义散列和相等测试......并且ConditionalWeakTable
记录不使用GetHashCode()
虚拟方法,而是使用默认散列函数。
因此我的问题是:是否有一些等价物Dictionary
会保留对值的弱引用并在引用悬空时释放键?