2009-12-28 2 views
1

문자열 입력에 대해 1 바이트의 출력을 제공하는 간단한 해시 알고리즘을 찾고 있습니다 (입력이 RFC822 전자 메일 주소 인 경우 유용합니다).간단한 해시 함수 (문자열 입력에서 1 바이트 출력)

나는 간단하고 빠르며 입력 차이를 확대하고 싶습니다 (두 개의 유사한 주소가 differnt outputs을가집니다).

Idealy가, 내가 XSL 대답을하고 싶습니다 (예, 나는. 1 바이트의 출력에 많은 요구 오전 ),하지만 난 자바 나 자바 스크립트 (중 하나에 가져 가서 다음과 같이 해시를 전달할 수 있습니다 XSL 프로세서에 대한 인수).

감사합니다.

+0

XSLT 기반 솔루션을 원한다면 1 바이트가된다면 정말 중요할까요? –

답변

1

9 비트의 정보가있는 CRC-8을 사용하여 한쪽 끝에서 약간 떨어 뜨려 하루 동안 호출하십시오. 그렇지 않으면 다른 일반적인 CRC 알고리즘을 사용하십시오.

1

hashCode() 표준 문자열의 최상위/최하위 바이트를 사용하지 않는 이유는 무엇입니까?

+0

그건 자바 솔루션으로 작동해야하지만, 나는 XSLT에 대한 것을 가지고있다. –

2

모든 해시 함수는 장단점이 있으며 빠르고 쉽게 계산할 수있는 데이터 유형은 특정 데이터 클래스에서 잘못 작동하는 경향이 있습니다. 시행 착오는 모든 해결책의 일부가되어야합니다. 다른 제안 이외에, 당신은 문자열의 모든 바이트 XOR 간단하게하는 것입니다 예를 들어, 해시 함수의 일환으로

hash = 0 
for (int i=0; i<data.length; i++) 
    hash = ((37 * hash) + data[i]) & 0xff; 
1

나의 제안을 정수의 곱셈을 사용하여 시도 할 수 있습니다. 모든 바이트의 모든 비트가 최종 결과에 영향을 미치며 모든 단일 비트 오류로 인해 해시가 달라집니다.

아주 간단하고 매우 빠릅니다. 결과 비트 수가 적 으면 다른 솔루션과 거의 비슷할 것입니다.

+1

대부분의 이메일 주소는 주로 '@'와 '.'가있는 소문자 ascii이므로 원하는 것보다 조금 더 원할 것입니다. 그래서 당신은 8보다는 오히려 변이의 약 5 비트를 얻습니다. –

+0

나는이 질문의 격렬하게 단순한 전제가 이것보다 더 많은 노력을 정당화한다고 믿지 않습니다. 31/32 건 (= 96.9 %) 또는 255/256 건 (= 99.6)의 서로 다른 주소를 감지하면 정말로 중요합니까? –

+0

간단한 XOR의 가능한 문제점은 "abc"가 "cba"와 같은 해시를 갖도록 순서에 영향을받지 않는다는 것입니다. 그러나 XOR은 궁극적으로 8 비트 출력을 사용하는 것이 기본적으로 불가능하기 때문에 궁극적으로 더 고통스러운 것으로 작동 할 수 있습니다. XOR 메서드는 비트 위치 중 * any *에서 홀수 개의 비트 오류를 ​​감지합니다. –