最近聊天的时候别人谈到 BKDR 不失为一个优秀的字符串 hash 函数,于是搜索了下,口碑不错,后来发现好像是 Kernighan 和 Dennis 两位大神在 The C Programming Language 里提出的,我还在 Kernighan 和 Rob Pike 大神写的 TPOP 里 2.9 节发现了它的身影。
网上有不少实现,足够对付部分数据集了,但实现都有些问题,不具备工业级的强度,所以我自己根据多个版本重写了一个,错误应该少点:
/*
* BKDR string hash function. Based on the works of Kernighan, Dennis and Pike.
*
* Copyleft(or right) 2011 fairywell
*/
unsigned int bkdr_hash(const char *str)
{
unsigned int seed = 131; // the magic number, 31, 131, 1313, 13131, etc.. orz..
while (*p)
hash = hash*seed + (*p++);
return hash % NHASH;
}
其中 NHASH 为 hash 表的长度。
网上有不少实现,足够对付部分数据集了,但实现都有些问题,不具备工业级的强度,所以我自己根据多个版本重写了一个,错误应该少点:
/*
* BKDR string hash function. Based on the works of Kernighan, Dennis and Pike.
*
* Copyleft(or right) 2011 fairywell
*/
unsigned int bkdr_hash(const char *str)
{
unsigned int seed = 131; // the magic number, 31, 131, 1313, 13131, etc.. orz..
unsigned int hash = 0;
unsigned char *p = (unsigned char *) str;while (*p)
hash = hash*seed + (*p++);
return hash % NHASH;
}
其中 NHASH 为 hash 表的长度。