| 1 | #include	"dthdr.h" | 
|---|
| 2 |  | 
|---|
| 3 | /* Hashing a string into an unsigned integer. | 
|---|
| 4 | ** The basic method is to continuingly accumulate bytes and multiply | 
|---|
| 5 | ** with some given prime. The length n of the string is added last. | 
|---|
| 6 | ** The recurrent equation is like this: | 
|---|
| 7 | **	h[k] = (h[k-1] + bytes)*prime	for 0 <= k < n | 
|---|
| 8 | **	h[n] = (h[n-1] + n)*prime | 
|---|
| 9 | ** The prime is chosen to have a good distribution of 1-bits so that | 
|---|
| 10 | ** the multiplication will distribute the bits in the accumulator well. | 
|---|
| 11 | ** The below code accumulates 2 bytes at a time for speed. | 
|---|
| 12 | ** | 
|---|
| 13 | ** Written by Kiem-Phong Vo (02/28/03) | 
|---|
| 14 | */ | 
|---|
| 15 |  | 
|---|
| 16 | uint dtstrhash(reg uint h, void* args, reg int n) | 
|---|
| 17 | { | 
|---|
| 18 | reg unsigned char*	s = (unsigned char*)args; | 
|---|
| 19 |  | 
|---|
| 20 | if(n <= 0) | 
|---|
| 21 | {	for(; *s != 0; s += s[1] ? 2 : 1) | 
|---|
| 22 | h = (h + (s[0]<<8) + s[1])*DT_PRIME; | 
|---|
| 23 | n = s - (unsigned char*)args; | 
|---|
| 24 | } | 
|---|
| 25 | else | 
|---|
| 26 | {	reg unsigned char*	ends; | 
|---|
| 27 | for(ends = s+n-1; s < ends; s += 2) | 
|---|
| 28 | h = (h + (s[0]<<8) + s[1])*DT_PRIME; | 
|---|
| 29 | if(s <= ends) | 
|---|
| 30 | h = (h + (s[0]<<8))*DT_PRIME; | 
|---|
| 31 | } | 
|---|
| 32 | return (h+n)*DT_PRIME; | 
|---|
| 33 | } | 
|---|
| 34 |  | 
|---|