哈希共享是指在内存中只保留一个特定对象的副本;也就是说,如果两个对象在语义上相等(具有相同的内容),则它们在物理上应该相等(在内存中位置相同)。通常通过保持全局哈希集并仅在它们不等于哈希集中的对象时创建新对象来实现该技术。
另一个要求是,哈希表中的对象应该是可回收的,如果除哈希表之外没有任何东西引用它们,则可以回收。换句话说,哈希表应该包含弱引用。
此问题进一步复杂化,需要具有常数时间、浅层哈希和相等性测试;因此,对象具有唯一标识符,当向表添加新对象时,它会增加。
我有一个工作实现,使用System.Collections.Generic.Dictionary<key, node>
,其中key
是给出节点的浅层摘要的元组(适合默认哈希和相等性测试),而node
是对象。唯一的问题是Dictionary
会保留对节点的强引用!
可以使用Dictionary
来添加 WeakReference
,但这不会释放指向悬空引用的键。
有人主张使用System.Runtime.CompilerServices.ConditionalWeakTable
,但是这个类似乎相反:它在收集键时释放值,而我需要在收集值时释放键。
可以尝试使用System.Runtime.CompilerServices.ConditionalWeakTable<node, node>
,但我需要自定义哈希和相等性测试...并且文档说明ConditionalWeakTable
不要使用GetHashCode()
虚拟方法,而是使用默认的哈希函数。
因此,我的问题是:是否有某个等效于Dictionary
,它将保留对值的弱引用并在引用变为悬空时释放键?
DependentHandle
可能会有所帮助:.NET 和 C# 中的 Ephemerons。 - Artem Koshelev