我正在考虑使用任意Java对象的哈希函数来进行练习。天真的方法是为每个属性调用hashCode() - 函数,添加这些哈希值,然后将总和模数加上最大哈希值,或类似的东西。但是,这意味着,只要打开属性,哈希值就会改变,因此如果要将对象存储在哈希表中,则不能使用此方法。对象的哈希码应表示其身份。但是,我如何将此抽象标识表示为整数值?也许通过使用对象地址(假设,Java在运行时不会在内存中移动对象),但在Java中是否有办法获取对象地址?
你将如何实现这样的哈希函数?
提前致谢。
答案 0 :(得分:4)
我认为Effective Java's chapter关于所有对象共有的方法在这里是一个很好的资源。
答案 1 :(得分:3)
java.lang.System
有一个方法identityHashCode(Object)
,它返回一个在对象生命周期内不会改变的值。它可能与对象的机器地址有关(以某种神秘的,依赖于实现的方式)。无论如何,这就是为什么那种方法存在的原因。
答案 2 :(得分:2)
这不是一个合适的哈希函数。请记住,如果两个对象相等,hashCode应该返回相同的值(根据相等的方法)。因此,使用对象的内存地址将不满足此条件。
查看hashCode合约。 http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()