2014-11-05 2 views
0

이 해시 함수에 어떤 문제가 있습니까? 특히, N = 127이 전달되면 어떻게됩니까?이 해시에 어떤 문제가 있습니까?

int hash3(char *k, int N) 
{ 
    char *c; int h = 0; 

    for (c = k; *c != '\0'; c++) { 
     h = h | *c; 
    } 
    return (h % N); 
} 

이것은 실습 시험에서 제기 된 질문이었습니다 (불행히도 해결책이 없었 음). 내가 이해하는 바와 같이 함수는 비트 단위를 사용하거나 문자열을 정수로 변환하여 크기 N의 테이블에 배치하지만 실제로 왜 잘못 될지 알지 못합니다. 미리 감사드립니다.

+0

긴 문장을 입력하고 반환 할 내용을 확인하십시오. – ymonad

답변

0

비트 OR과 같은 단조로운 함수는 해시 계산에 적합하지 않습니다.

아시다시피 OR 연산자 "|" 다음과 같이 작업하십시오.

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

1이 사망 한 적이 없으므로 OR 연산이 단조로운 증분 함수입니다.

OR 연산을 많은 데이터에 반복 적용하면 결과가 '1'이 될 가능성이 높습니다.

코드에 긴 문자 시퀀스를 적용하면 결과가 자주 또는 거의 대부분 127 ('1111111'이진 형식) 일 수 있습니다.

비트 AND는 또한 AND가 단조 감소 함수이므로 적합하지 않습니다.

XOR은 해시 계산에 가장 적합한 비트 연산입니다.

+0

아! 그건 의미가 있습니다! 고맙습니다. – Chris

관련 문제