2012-04-22 2 views
3

길이가 128자인 부울 문자열 (예 : "01100..001")을 가지고 있습니다 (128 개의 숫자가 0/1 임). 나는 Java에서 효율적인 (빠른) 해시 함수를 찾고 있는데, 이는 128 비트보다 훨씬 더 적은 표현을 생성하고 분명히 적은 충돌로 생성합니다. 아무도 날 도와 드릴까요? 그런 해시 함수가 있습니까? 어떠한 제안 ?Java Fastest Hash Function

+3

128 비트 표현으로 얻을 수있는 0보다 충돌이 적습니까? – eggyal

+0

@eggyal, 고마워. 좋은 개념. 그것은 나를 많이 도울 것입니다. :) – Arpssss

+0

단지 128 비트 값을 저장하기 위해 문자열을 사용하는 것은 나에게 약간의 과잉 공격, 기억 낭비 및 특히 성능에 신경 쓰는 경우 - 확실히 최선의 선택이 아닌 것처럼 보입니다. – MRalwasser

답변

5

Java String 클래스의 .hashCode() 메서드를 사용하면 int을 반환하며 매우 빠릅니다.

또는 BitSet에 데이터를 저장하려는 경우 Pulsar가 제안하는대로 java.util.BitSet에서 .hashCode() 메서드를 사용할 수 있습니다.

+0

나는'String'을'BigInteger'로 먼저 변환하고'.hashCode()'메서드를 호출한다는 것을 제외하고는 말할 것입니다. 하지만 당신이 제안한 것처럼 원래의 문자열을 해쉬하는 것이 더 빠르다 고 생각합니다. 왜 16 바이트가 128 바이트의'String'으로 저장되기를 원하는지 궁금 할 것입니다. 이것은 공간의 막대한 낭비처럼 보입니다. – ZeroOne

+0

고마워요. 시도하는 것이 좋을 것이다. 그러나 충돌 가능성을 설명하는 문서가 있습니까? – Arpssss

+0

@ ZeroOne, 나는 또한 BigInt로 변환하고 hashcode를 호출 할 생각이다. 왜냐하면, 충돌이 적을 것이라고 생각합니다. – Arpssss

7

대신에 java.util.BitSet을 사용 해본 적이 있습니까? 사용하고있는 작업에 따라 훨씬 쉽고 효율적으로 사용할 수 있습니까? http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html 또한 .hashCode() 방법이 있습니다.

+0

고마워. 시도하는 것이 좋을 것이다. 그러나 충돌 확률을 나타내는 문서가 있습니까? – Arpssss

+0

내가 아는 것은 아닙니다. 2004 년 (버그 퍼레이드 참조 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4979028) 및 java doc show (hash?)에서 해시 코드 계산 방식이 개선되었다는 것을 알고 있습니다. 소스 물론 사용할 수 있습니다. http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html#hashCode() –

1

문자열의 해시를 계산해야하는 경우 String 클래스의 hashCode() 메서드를 사용하기 만하면됩니다. 구현에 따라이 값을 빠르게 계산할 수있는 몇 가지 최적화가 이루어집니다. String Class 구성 hashCode()OpenJDK 방법의 구현 예로서

hash 속성의 값을 캐시 번만 계산되어야한다.

128 자의 문자열에 128 비트의 해시가 있다고 누가 알았습니까? Java에서 hashCode() 메소드에 의해 리턴 된 모든 해시는 int 유형이고 Java의 int는 32 비트를 사용하여 표시됩니다.