我见过克努特使用:
register int h,k; register char *p;
for (h=0,p=w;*p;p++) h=(*p+h+h)%hash_prime;
哪里hash_prime比在4倍哈希表活条目的预期数量的黄金大。
请参阅:Knuth's literateprogramming.com,冒险的例子。
这里的上下文中的散列码:
#define hash_prime 1009/* the size of the hash table */
typedef struct {
char text[6]; /* string of length at most 5 */
char word_type; /* a |wordtype| */
char meaning;
} hash_entry;
hash_entry hash_table[hash_prime]; /* the table of words we know */
void new_word(w,m)
char *w; /* a string of length 5 or less */
int m; /* its meaning */
{
register int h,k; register char *p;
for (h=0,p=w;*p;p++) h=(*p+h+h)%hash_prime;
while (hash_table[h].word_type) {
h++;if (h==hash_prime) h=0;
}
int lookup(w)
char *w; /* a string that you typed */
{
register int h; register char *p; register char t;
t=w[5]; w[5]='\0'; /* truncate the word */
for (h=0,p=w;*p;p++) h=(*p+h+h)%hash_prime; /* compute starting address */
w[5]=t; /* restore original word */
if (h<0) return -1; /* a negative character might screw us up */
while (hash_table[h].word_type) {
if (streq(w,hash_table[h].text)) return h;
h++;if (h==hash_prime) h=0;
}
return -1;
}
注意,此代码:
register char t;
// . . .
t=w[5]; w[5]='\0'; /* truncate the word */
// . . .
w[5]=t; /* restore original word */
是为特定的要求只能看前5个字符,并应该被删除,所以你哈希整个词。
'SHA512'怎么样?你只需要8个'uint64_t'就可以进行快速查找。 – 2013-02-14 19:45:58
填充因子是什么?散列值有多少位?什么是你的散列函数?你知道最后一个字符只有26个可能的值吗? (或52或62 ...) – wildplasser 2013-02-14 19:48:35
...或使用http://www.gnu.org/software/gperf/ – 2013-02-14 19:51:21