2011-09-14 3 views
4

나는 운동 수단을위한 임의의 Java 객체에 대한 해시 함수에 대해 생각하고있다. 순진한 방법은 각 속성에 대해 hashCode() - 함수를 호출하고 이러한 해시를 추가 한 다음 최대 해시 값을 모듈로 합한 값을 취하는 것입니다. 그러나 특성의 on이 변경 될 때마다 해시 값이 변경되므로 해시 테이블에 개체를 저장하려는 경우에는이 메서드를 사용할 수 없습니다. 객체의 해시 코드는 해당 객체의 ID를 나타내야합니다. 그러나이 추상적 인 정체성을 어떻게 정수 값으로 표현할 수 있습니까? 어쩌면 객체 주소를 사용하여 (자바가 런타임 중에 메모리의 객체를 움직이지 않는다고 가정), 객체 주소를 얻기위한 Java의 방법이 있습니까?자바 : 객체를위한 해쉬 함수

어떻게 해시 함수를 구현 하시겠습니까?

미리 감사드립니다.

+1

GC 이동 객체 및 해시 코드에 대한 자세한 내용은 http://stackoverflow.com/questions/7207302/if-javas-garbage-collector-moves-objects-what-is-object-hashcode-and-system-ide –

답변

2

java.lang.System에는 개체 수명 동안 변경되지 않는 값을 반환하는 identityHashCode(Object) 메서드가 있습니다. 객체의 머신 주소와 관련 될 수 있습니다 (일부 신비적 인 구현 방식에 따라). 어쨌든, 이것이 그 방법이 존재하는 이유입니다.

+0

을 참조하십시오. 이것은 요청 된 Integer와 같은 객체에 대한 equals 테스트에 실패하지 않습니까? –

+0

나는 당신을 의미한다고 생각한다 : System.identityHashCode (object). identityHashCode 메소드는 java.lang.Object에 속하지 않습니다. –

+0

네, 그렇습니다. 그러나 변경 가능한 객체에 대해 불변의 해시를 원한다면 항상 모든 객체에 대해 동일한 값을 반환하지 않는 한이 테스트는 항상 실패합니다. 포스터는 신원 기반 해시를 원하며 이것이 그 것입니다. 당신은 당신의 케이크를 먹을 수도없고 먹을 수도 없습니다. –

2

적절한 해시 함수가 아닙니다. hashCode는 두 개의 객체가 같은 경우 (동일한 메소드에 따라) 동일한 값을 반환해야 함을 기억하십시오. 따라서 객체의 메모리 주소를 사용하면이 기준을 충족하지 못합니다.

hashCode 계약을 확인하십시오. http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()

+0

하지만 마지막 줄에서는 java.lang.Objects에 대해 말하지만 실제로는 대개 객체의 주소를 사용합니다. 그래서 만약 우리가 일반 객체가 동일한 신원을 가지고 있다면 일반 객체가 다른 객체와 같다고 가정하면 메모리 주소를 사용하는 것이 적절할 것입니다. – j0ker

+0

맞습니다. equals가 동일성을 기반으로하고 클래스의 별개의 인스턴스가 동일하지 않은 한, 주소의 Object의 기본 메커니즘을 사용하면 유효합니다. –