해시 기반 정렬을 연구하고 해시 함수에서 소수를 사용하는 것이 좋은 아이디어로 간주됩니다. 왜냐하면 : 키의 각 문자에 소수와 결과를 추가하면 소수가 고유하기 때문에 고유 한 값을 생성하고 31과 같은 소수는 키의 분배를 향상시킵니다.해시 함수에서 소수의 사용에 대한 분석
각 문자를 곱하기 위해 짝수를 사용하는 이유는 무엇입니까? 아래의 설명에 대한 잘못된 생각 (다른 포럼에서 발견, 좋은 설명처럼 들리지만 나는 그것을 이해하지 못하고있다).
public int hashCode()
{
int h = hash;
if (h == 0)
{
for (int i = 0; i < chars.length; i++)
{
h = MULT*h + chars[i];
}
hash = h;
}
return h;
}
한다고 가정 MULT 26이었고, 백 - 문자열을 해시 을 고려 : 아래의 추론이 유효하지 않은 경우 ..
key(s)=s[0]*31(len–1)+s[1]*31(len–2)+ ... +s[len–1]
샘플 코드를 간단한 설명을 부탁드립니다합니다. 문자열의 첫 번째 문자의 영향은 얼마나됩니까 값이
h'? The first character's value will have been multiplied by MULT 99 times, so if the arithmetic were done in infinite precision the value would consist of some jumble of bits followed by 99 low-order zero bits -- each time you multiply by MULT you introduce another low-order zero, right? The computer's finite arithmetic just chops away all the excess high-order bits, so the first character's actual contribution to
h ' ... 정확히 0입니다!h' value depends only on the rightmost 32 string characters (assuming a 32-bit int), and even then things are not wonderful: the first of those final 32 bytes influences only the leftmost bit of
h '이고 나머지는 에 영향을 미치지 않습니다. 분명히 짝수 인 MULT는 좋지 않습니다.
대한 아마 적절한 포맷하시기 바랍니다 코드, 들으 문자열에서 스와핑 32 문자 블록이 동일한 해시 값을 줄 것이다 문제가있다. – ThomasMcLeod
완료 ... 감사합니다! – maxpayne
'unsigned int'를 사용해야합니다. C에서 정수 오버플로는 정의되지 않은 동작입니다. – vonbrand