2012-09-01 4 views
0

PK가 두 개의 짧은 varchar (15와 5)와 하나의 datetime 필드로 구성된 테이블을 가지고 있습니다.Hibernate 복합 키에 대한 bulletprooh hashCode 생성

hashCode 만들기에 대한 나의 생각은 datetime을 yyyyMMddHHmmss와 같은 형식으로 구성한 다음 일부 구분 기호 (예 : _)를 사용하여 다른 두 필드와 연결 한 다음 해당 문자열에 대한 해시 코드를 요청하는 것이 었습니다.

더 세련된 접근 방식이 궁금합니다.

감사

+1

이 질문은 최대 절전 모드와 관련이 없습니다. 해시 코드를 작성하는 가장 좋은 방법을 따르십시오 (여러 번 묻고 답했습니다). 기본적으로 여러 필드가있는 객체의 해시 코드를 계산하려면 각 개별 필드에 대한 해시 코드를 계산하고 어떤 방식으로 결합합니다 (xor 추가 등). – JimN

+0

내 관심사는 두 개의 숫자를 더하면 다른 두 개의 완전히 다른 숫자를 더하는 것과 같은 결과를 산출한다는 것입니다. 예 : 5 + 6 = 7 + 4. 그래서이 방법을 사용하기를 주저합니다. – amphibient

+1

두 객체가 동일한 해시 코드를 생성하는 것은 합법적입니다. 이것을 해시 콜리 전 (hash collision)이라고하며, 대부분의 경우 피할 수 없습니다. 해시 코드에 의존하는 데이터 구조는 버킷 체인 또는 선형 프로빙과 같은 기법을 사용하여 해시 콜리 전을 처리 할 수 ​​있도록 준비되어야합니다. – JimN

답변

0

모든 당신이 "방탄"무슨 뜻인지에 따라 달라집니다. Java 객체의 hashCode으로 사용할 수 있다는 것을 의미하면 괜찮습니다. 최대 절전 모드에서는 날짜 시간을 Java Date으로 반환하지 않습니까? 그렇다면 DatehashCode을 사용하십시오. 연결 및 해시 대신 다른 hashCode을 xor (또는 추가 ...) 할 수 있습니다. 조금 더 빨라질 수 있습니다.

"방탄"으로 암호화 된 보안 해시가 필요한 경우 더 많은 작업을 수행해야합니다.

+0

"방탄"이란 의미는 속임수 또는 가양 성이 없다는 것을 보장합니다. 추가 된 해시 코드가 끝나는 완전히 다른 속성의 두 튜플을 가질 수 있기 때문에 각 필드의 해시 코드를 간단히 추가하는 것에 회의적입니다. 예 5 + 6 = 7 + 4와 비슷합니다. – amphibient

+2

해시 코드가 "중복되지 않도록"설정되어 있지 않습니다. 아마도 N 바이트 길이의 것을 가져 와서 알고리즘을 통해 무언가를 생성 할 것입니다 M 바이트 길이, 여기서 N은 M보다 큽니다. N의 가능한 모든 값을 M 바이트로 인코딩 된 방식으로 나타낼 수 있다면 더 많은 전력을 얻을 수 있지만 일반적으로 주어진 해시 값은 원래 문자열. – arcy

+0

내가이 방법을 쓰도록하겠습니다. 여기서 JimN을 위해 Hibernate가 작동하는 곳이 있습니다 : 나는 Hibernate에 의해 PK 식별에서 어떤 역할 hashCode가 재생 될지 정확히 모르지만, XYZ가 절대로 절대 존재하지 않도록하고 싶습니다. 두 개의 완전히 다른 튜플의 해시 코드가 같을지라도 ABC와 혼동을 일으킬 수 있습니다. 내가 뭘 바라는 건 오버라이드 된 equals 메소드가 그것을 확인하는 것이다. 내가 맞습니까? 덕분에 – amphibient

관련 문제