字符串哈希函数,发现几乎所有的流行的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
分享到:
相关推荐
复制代码 代码如下: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-1a 哈希算法的时间相关唯一 ID 生成器。 生成的 id 由前缀字母或字符串、时间戳(以 base 36 编码)和给定值的fnv哈希组成。 由生成的 FNV-1a 哈希使这些 id 可以安全地用于服务器端记录查找,因为它...
哈希算法的性能通常由三个指标衡量:装载因子(Load Factor)、平均查找时间(Average Search Time)和最坏情况下的查找时间(Worst-case Search Time)。装载因子是指已用桶的数量与总桶数的比例,它直接影响查找...
2. **JS哈希(Jenkins One-at-a-Time哈希)** JS哈希由Bob Jenkins设计,它使用异或操作(`^`)和左移(`)来混合字符。在`JSHash`函数中,每次迭代时,哈希值会与当前字符进行异或,并且根据位移进行混合,这样...
SM3哈希算法继承了传统哈希算法的特性,如单向性、抗碰撞性和敏感性。单向性指的是数据一旦经过哈希算法处理,就无法逆向推导出原始数据;抗碰撞性意味着很难找到两个不同的输入数据,使得它们拥有相同的哈希输出值...
总结起来,Times33和CRC33是两种不同类型的哈希算法,它们各有优缺点。Times33简单快速,适合对性能要求高的场景,而CRC33则在数据校验方面表现出色。在PHP中,开发者可以根据项目需求选择合适的哈希函数,确保数据...
2. **JSHash**(Jenkin's One At-A-Time哈希函数): JSHash使用一个初始哈希值,并结合位操作进行迭代计算。对于每个字符,它将哈希值左移5位,加上字符的值,并与右移2位的哈希值进行异或操作。这种方法使得每个...
文中提及了两种并行算法:经典的稀疏完美哈希算法和布谷鸟哈希(Cuckoo Hashing)。稀疏完美哈希算法是一种空间利用率较低但查询效率高的算法;而布谷鸟哈希通过允许多个位置存储同一个元素来提高空间的利用率,并将...
代码首先定义了一个测试迭代次数`testtime`,然后遍历`hash_algos()`返回的算法数组,对每个算法执行`testtime`次哈希操作,并记录起始和结束时间。通过计算两者的差值,可以得到每种算法执行时间,最后使用`asort()...
1. **哈希函数选择**:LSH算法通常使用多个不同的哈希函数,这些函数应满足“局部敏感”的特性,即相似数据经过哈希后得到相同的哈希值的概率高于不相似数据。 2. **哈希表构造**:使用选择的哈希函数将数据映射到...
在实际实现中,通常会使用数据结构如链表或哈希表来跟踪页面的使用情况。当需要替换页面时,选择最后一次使用时间最早的页面。然而,上述代码并没有直接实现LRU算法,因为没有记录页面的使用历史。 实验目的旨在让...
3. **分析方法**:时间复杂度(Time Complexity)和空间复杂度(Space Complexity)是评估算法效率的主要工具。我们需要理解大O符号表示法,掌握如何计算一个算法在最坏、最好和平均情况下的运行时间。 4. **排序与...
- **线性时间排序(Sorting in Linear Time)**:介绍了一系列可以在线性时间内完成排序的算法,如计数排序、基数排序等,适用于特定条件下的排序需求。 #### 3. 数据结构 - **哈希表(Hash Tables)**:一种高效...
4. 线性时间排序(Sorting in Linear Time) 在某些特殊情况下,例如已知输入数据的特定性质,可以实现比O(n log n)更快的排序算法,即O(n)时间复杂度的排序算法。线性时间排序一般指的是那些针对特定类型数据设计的...
【计算模型与算法技术:空间与时间权衡】 在计算模型和算法设计中,空间与时间权衡是一个至关重要的概念,对于理论研究者和实际应用开发者来说都是如此。这一概念指出,在设计算法时,我们通常需要在存储空间的消耗...
**标题**:“Sorting in Linear Time” **知识点**: 1. **计数排序**:适用于一定范围内的整数排序,通过统计每个值出现的次数来进行排序。 2. **基数排序**:适用于多位数的排序,按位从低位到高位进行排序。 3. *...
Sorting in Linear Time(线性时间排序) 本章讨论了几种可以在线性时间内完成排序任务的算法,如计数排序、基数排序等。这些算法适用于特定类型的输入数据,能够在特定条件下提供极高的效率。 #### 8. Medians ...
6. 线性时间排序(Sorting in Linear Time):线性时间排序算法试图找到一种在最坏情况下也能保持线性时间复杂度的排序方法,如基数排序和计数排序等。 7. 中位数与顺序统计(Medians and Order Statistics):中位...
- 通过哈希函数将键映射到表中位置的数据结构,提供快速查找、插入和删除操作。 以上知识点涵盖了算法导论的核心内容,包括基本概念、设计技巧和具体算法实例。这些知识点不仅是学习算法的基础,也是计算机科学...