BKDRhash 的一个较正确的实现

  最近聊天的时候别人谈到 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..

         unsigned int hash = 0;

         unsigned char *p = (unsigned char *) str;
         while (*p)
             hash = hash*seed + (*p++);
         return hash % NHASH;
     }


     其中 NHASH 为 hash 表的长度。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值