`
deepfuture
  • 浏览: 4412982 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80136
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70365
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103607
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:286603
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15056
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67816
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32293
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46075
社区版块
存档分类
最新评论

Time33哈希算法

 
阅读更多

字符串哈希函数,发现几乎所有的流行的HashMap都采用了DJB Hash Function,俗称“Times33”算法。Times33的算法很简单,就是不断的乘33,见下面算法原型。

hash(i) = hash(i-1) * 33 + str[i]

 

uint32_t time33(char const *str, int len) 
    { 
        unsigned long  hash = 0; 
        for (int i = 0; i < len; i++) { 
            hash = hash *33 + (unsigned long) str[i]; 
        } 
        return hash; 
    }
 
什么是33的倍数, 
PHP中注释是

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->DJBX33A (Daniel J. Bernstein, Times 33 with Addition)
  This is Daniel J. Bernstein's popular `times 33' hash function as
  posted by him years ago on comp.lang.c. It basically uses a function
  like ``hash(i) = hash(i-1) * 33 + str[i]''. This is one of the best
  known hash functions for strings. Because it is both computed very
  fast and distributes very well.
  The magic of number 33, i.e. why it works better than many other
  constants, prime or not, has never been adequately explained by
  anyone. So I try an explanation: if one experimentally tests all
  multipliers between 1 and 256 (as RSE did now) one detects that even
  numbers are not useable at all. The remaining 128 odd numbers
  (except for the number 1) work more or less all equally well. They
  all distribute in an acceptable way and this way fill a hash table
  with an average percent of approx. 86%.
  If one compares the Chi^2 values of the variants, the number 33 not
  even has the best value. But the number 33 and a few other equally
  good numbers like 17, 31, 63, 127 and 129 have nevertheless a great
  advantage to the remaining numbers in the large set of possible
  multipliers: their multiply operation can be replaced by a faster
  operation based on just one shift plus either a single addition
  or subtraction operation. And because a hash function has to both
  distribute good _and_ has to be very fast to compute, those few
  numbers should be preferred and seems to be the reason why Daniel J.
  Bernstein also preferred it.
                   -- Ralf S. Engelschall rse@engelschall.com
 
 
分享到:
评论

相关推荐

    php-perl哈希算法实现(times33哈希算法)

    复制代码 代码如下:APR_DECLARE_NONSTD(unsigned int) apr_hashfunc_default(const char *char_key, apr_ssize_t *klen){ unsigned int hash = 0; const unsigned char *key = (const unsigned char *)char_key;...

    fnv-time:基于 FNV-1a 哈希算法的时间相关唯一 ID 生成器

    时间 基于 FNV-1a 哈希算法的时间相关唯一 ID 生成器。 生成的 id 由前缀字母或字符串、时间戳(以 base 36 编码)和给定值的fnv哈希组成。 由生成的 FNV-1a 哈希使这些 id 可以安全地用于服务器端记录查找,因为它...

    HASH课程设计参考

    哈希算法的性能通常由三个指标衡量:装载因子(Load Factor)、平均查找时间(Average Search Time)和最坏情况下的查找时间(Worst-case Search Time)。装载因子是指已用桶的数量与总桶数的比例,它直接影响查找...

    经典hash算法

    2. **JS哈希(Jenkins One-at-a-Time哈希)** JS哈希由Bob Jenkins设计,它使用异或操作(`^`)和左移(`)来混合字符。在`JSHash`函数中,每次迭代时,哈希值会与当前字符进行异或,并且根据位移进行混合,这样...

    Research and Implementation of Time Synchronous Dynamic Password Based on SM3

    SM3哈希算法继承了传统哈希算法的特性,如单向性、抗碰撞性和敏感性。单向性指的是数据一旦经过哈希算法处理,就无法逆向推导出原始数据;抗碰撞性意味着很难找到两个不同的输入数据,使得它们拥有相同的哈希输出值...

    PHP Hash算法:Times33算法代码实例

    总结起来,Times33和CRC33是两种不同类型的哈希算法,它们各有优缺点。Times33简单快速,适合对性能要求高的场景,而CRC33则在数据校验方面表现出色。在PHP中,开发者可以根据项目需求选择合适的哈希函数,确保数据...

    常用Hash算法(C语言的简单实现)

    2. **JSHash**(Jenkin's One At-A-Time哈希函数): JSHash使用一个初始哈希值,并结合位操作进行迭代计算。对于每个字符,它将哈希值左移5位,加上字符的值,并与右移2位的哈希值进行异或操作。这种方法使得每个...

    Real-Time Parallel Hashing on the GPU

    文中提及了两种并行算法:经典的稀疏完美哈希算法和布谷鸟哈希(Cuckoo Hashing)。稀疏完美哈希算法是一种空间利用率较低但查询效率高的算法;而布谷鸟哈希通过允许多个位置存储同一个元素来提高空间的利用率,并将...

    PHP中对各种加密算法、Hash算法的速度测试对比代码

    代码首先定义了一个测试迭代次数`testtime`,然后遍历`hash_algos()`返回的算法数组,对每个算法执行`testtime`次哈希操作,并记录起始和结束时间。通过计算两者的差值,可以得到每种算法执行时间,最后使用`asort()...

    LSH.zip_Basic LSH_LSH MT_locality sensitive_time series_局部敏感哈希

    1. **哈希函数选择**:LSH算法通常使用多个不同的哈希函数,这些函数应满足“局部敏感”的特性,即相似数据经过哈希后得到相同的哈希值的概率高于不相似数据。 2. **哈希表构造**:使用选择的哈希函数将数据映射到...

    页面置换算法(FIFO算法,LRU算法)

    在实际实现中,通常会使用数据结构如链表或哈希表来跟踪页面的使用情况。当需要替换页面时,选择最后一次使用时间最早的页面。然而,上述代码并没有直接实现LRU算法,因为没有记录页面的使用历史。 实验目的旨在让...

    算法设计与分析-王秋芬(改).rar

    3. **分析方法**:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)是评估算法效率的主要工具。我们需要理解大O符号表示法,掌握如何计算一个算法在最坏、最好和平均情况下的运行时间。 4. **排序与...

    算法导论及课后习题与思考题答案(完整英文版第2版)

    - **线性时间排序(Sorting in Linear Time)**:介绍了一系列可以在线性时间内完成排序的算法,如计数排序、基数排序等,适用于特定条件下的排序需求。 #### 3. 数据结构 - **哈希表(Hash Tables)**:一种高效...

    算法导论课后习题与思考题答案合集

    4. 线性时间排序(Sorting in Linear Time) 在某些特殊情况下,例如已知输入数据的特定性质,可以实现比O(n log n)更快的排序算法,即O(n)时间复杂度的排序算法。线性时间排序一般指的是那些针对特定类型数据设计的...

    计算模型与算法技术:7-Space and Time Tradeoffs.ppt

    【计算模型与算法技术:空间与时间权衡】 在计算模型和算法设计中,空间与时间权衡是一个至关重要的概念,对于理论研究者和实际应用开发者来说都是如此。这一概念指出,在设计算法时,我们通常需要在存储空间的消耗...

    MIT 算法分析讲义

    **标题**:“Sorting in Linear Time” **知识点**: 1. **计数排序**:适用于一定范围内的整数排序,通过统计每个值出现的次数来进行排序。 2. **基数排序**:适用于多位数的排序,按位从低位到高位进行排序。 3. *...

    算法导论 手册 作者自己写的

    Sorting in Linear Time(线性时间排序) 本章讨论了几种可以在线性时间内完成排序任务的算法,如计数排序、基数排序等。这些算法适用于特定类型的输入数据,能够在特定条件下提供极高的效率。 #### 8. Medians ...

    算法导论第二版答案

    6. 线性时间排序(Sorting in Linear Time):线性时间排序算法试图找到一种在最坏情况下也能保持线性时间复杂度的排序方法,如基数排序和计数排序等。 7. 中位数与顺序统计(Medians and Order Statistics):中位...

    算法导论 练习题答案

    - 通过哈希函数将键映射到表中位置的数据结构,提供快速查找、插入和删除操作。 以上知识点涵盖了算法导论的核心内容,包括基本概念、设计技巧和具体算法实例。这些知识点不仅是学习算法的基础,也是计算机科学...

Global site tag (gtag.js) - Google Analytics