首页 > 解决方案 > 按地址散列对象并复制垃圾收集

问题描述

有时创建一个哈希表很方便,其中哈希函数使用哈希对象的地址。散列函数易于实现且执行成本低。

但是,如果您在使用某种形式的复制垃圾收集的系统上工作,则会出现问题,因为在移动对象后,先前计算的哈希值不正确。即使在垃圾收集期间或之后重新散列表似乎也存在问题,因为(原则上)散列函数可能会消耗内存并触发另一个垃圾收集。

我的问题是如何解决这些问题。如果没有某种妥协,我没有看到任何干净的解决方案。

标签: data-structuresgarbage-collectionhashtable

解决方案


如何解决此问题取决于所使用的特定编程语言的特定生态系统提供的工具。

例如,在 C# 中,可以RuntimeHelpers.GetHashcode()用于获取一个哈希值,该哈希值保证不会在对象的整个生命周期内发生变化,即使发生垃圾回收并且对象的物理地址在内存中发生变化也是如此。


推荐阅读