2016-09-14 1 views
0

Java에서 주어진 String에 대해 고유 해시를 계산하는 방법을 찾고 있습니다. 여러분은 MD5 나 SHA1을 사용할 수없는 것 같습니다. 사람들이 깨 졌다고해서 항상 유일성을 보장하지는 않기 때문입니다.Java에서 주어진 String으로부터 고유 한 해시를 도출/계산하는 가장 좋은 방법

equals() 메서드로 동일한 두 String 개체에 대해 동일한 해시 (MD5 Sum과 같은 32 자 문자열이 바람직 함)를 가져야합니다. 그리고 다른 String은이 해시를 생성하지 않아야합니다. 까다로운 부분입니다.

Java에서이를 수행 할 수있는 방법이 있습니까?

+4

을 당신은 * 항상 * 일부 값 사이의 충돌을해야합니다. 32 문자'문자열'보다'문자열'이 더 많습니다. – resueman

+0

맞아! 이론적으로 불가능합니다. 감사! – rkrishnan

답변

4

보증 된 고유 해시 코드가 필요한 경우 불가능합니다 (이론적으로 가능하지만 실제로는 불가능 함). 해시 및 해시 코드는 고유하지 않습니다.

길이가 N 인 Java 문자열은 가능한 상태가 65536^N이고 모든 가능한 값을 나타 내기 위해 의 정수가 16 * N 비트가 필요합니다. 더 작은 범위 (예 : 16 비트 미만)로 정수를 생성하는 해시 함수를 작성하면 개 이상의 문자열이 같은 정수로 해시되는 경우를 찾을 수 있습니다. 즉, 해시 코드는 고유 일 수 없습니다. 이것을 비둘기 원리 (Pigeonhole Principle)라고하며, 직선 수학 증명이 있습니다. (당신은 수학적으로 싸울 수 없으며 승리 할 수 ​​없습니다!)

그러나 유일하지 않은 가능성이 매우 낮은 "아마도 유일하다"가 이라면 암호 해시가 좋은 대답입니다. 수학은 에 해시가 얼마나 큰지 (즉, 얼마나 많은 비트가 있는지) 알려 주어서 (충분히 낮음) 확률이 아닌 고유성을 달성해야합니다. 업데이트

이 또 다른 좋은 답변 확인 : What is a good 64bit hash function in Java for textual strings?

관련 문제