在Redis中,采用Bernstein的Hash算法,具体代码如下:
unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
unsigned int hash = 5381;
while (len--)
hash = ((hash << 5) + hash) + (*buf++); /* hash * 33 + c */
return hash;
}
解释:
把字符串转化成一个无符号32位int类型,范围从 0x00000000U到 0xFFFFFFU,但是不可以直接用的Hash Table的索引。一般情况下 dictht数据结构中的 table成员也不会申请如此大的空间。具体做法是,再用Hash值与dictht数据结构的sizemask计算取余数。
idx = h & d->ht[table].sizemask;