php-perl哈希算法实现(times33哈希算法)
php-perl哈希实现算法–DJBX33A(Daniel J. Bernstein, Times 33 with Addition)APR哈希默认算法
复制代码 代码如下:
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;
const unsigned char *p;
apr_ssize_t i;
/*
* This is the popular `times 33' hash algorithm which is used by
* perl and also appears in Berkeley DB. This is one of the best
* known hash functions for strings because it is both computed
* very fast and distributes very well.
*
* The originator may be Dan Bernstein but the code in Berkeley DB
* cites Chris Torek as the source. The best citation I have found
* is "Chris Torek, Hash function for text in C, Usenet message
* in comp.lang.c , October, 1990." in Rich
* Salz's USENIX 1992 paper about INN which can be found at
* .
*
* 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 I did while writing a low-level
* data structure library some time ago) 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 (see
* Bob Jenkins ``Hashing Frequently Asked Questions'' at
* for a description
* of chi^2), 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.
*
* -- Ralf S. Engelschall
*/
if (*klen == APR_HASH_KEY_STRING) {
for (p = key; *p; p++) {
hash = hash * 33 + *p;
}
*klen = p - key;
}
else {
for (p = key, i = *klen; i; i--, p++) {
hash = hash * 33 + *p;
}
}
return hash;
}
对函数注释部分的翻译: 这是很出名的times33哈希算法,此算法被perl语言采用并在Berkeley DB中出现.它是已知的最好的哈希算法之一,在处理以字符串为键值的哈希时,有着极快的计算效率和很好哈希分布.最早提出这个算法的是Dan Bernstein,但是源代码确实由Clris Torek在Berkeley DB出实作的.我找到的最确切的引文中这样说”Chris Torek,C语言文本哈希函数,Usenet消息 in comp.lang.c ,1990年十月.”在Rich Salz于1992年在USENIX报上发表的讨论INN的文章中提到.这篇文章可以在上找到. 33这个奇妙的数字,为什么它能够比其他数值效果更好呢?无论重要与否,却从来没有人能够充分说明其中的原因.因此在这里,我来试着解释一下.如果某人试着测试1到256之间的每个数字(就像我前段时间写的一个底层数据结构库那样),他会发现,没有哪一个数字的表现是特别突出的.其中的128个奇数(1除外)的表现都差不多,都能够达到一个能接受的哈希分布,平均分布率大概是86%. 如果比较这128个奇数中的方差值(gibbon:统计术语,表示随机变量与它的数学期望之间的平均偏离程度)的话(见Bob Jenkins的,中对平方差的描述),数字33并不是表现最好的一个.(gibbon:这里按照我的理解,照常理,应该是方差越小稳定,但是由于这里不清楚作者方差的计算公式,以及在哈希离散表,是不是离散度越大越好,所以不得而知这里的表现好是指方差值大还是指方差值小),但是数字33以及其他一些同样好的数字比如 17,31,63,127和129对于其他剩下的数字,在面对大量的哈希运算时,仍然有一个大大的优势,就是这些数字能够将乘法用位运算配合加减法来替换,这样的运算速度会提高.毕竟一个好的哈希算法要求既有好的分布,也要有高的计算速度,能同时达到这两点的数字很少.
,
热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Golang是一门新型的高性能编程语言,具有丰富的标准库和内置函数。其中就包括哈希函数,它们可以用来生成数据的哈希值,用于文件校验、数据验证等方面。本文将介绍Golang中常用的函数hash、crc32、md5和sha1的计算方法及其应用。一、hash函数Golang的hash函数包含了多种哈希算法,如SHA-1、MD5、SHA-224、SHA-256、SH

在Java函数库中,MessageDigest类可用于哈希算法,并提供MD5、SHA和其他哈希算法的实现,包括:1.MD5算法:使用MessageDigest.getInstance("MD5")获取实例。2.SHA算法:包括SHA-1、SHA-256、SHA-384和SHA-512,使用MessageDigest.getInstance("SHA-256")获取实例。3.其他哈希算法:可以使用第三方库,例如Algorithms.MessageDigest或BouncyCastle库。

如何使用Java实现MD5哈希算法MD5(MessageDigestAlgorithm5)是一种常用的哈希算法,用于对数据进行加密和校验的操作。在Java中,我们可以利用MessageDigest类来实现MD5哈希算法。以下是一个简单的示例代码,演示了如何使用Java实现MD5算法。importjava.security.MessageDigest;

哈希 又称作 “散列”,它接收任何一组任意长度的输入信息,通过 哈希 算法变换成固定长度的数据指纹,该指纹就是 哈希值。总体而言,哈希 可理解为一种消息摘要。

Python底层技术揭秘:如何实现哈希表哈希表是在计算机领域中十分常见且重要的数据结构,它可以高效地存储和查找大量的键值对。在Python中,我们可以使用字典来使用哈希表,但是很少有人深入了解它的实现细节。本文将揭秘Python中哈希表的底层实现技术,并给出具体的代码示例。哈希表的核心思想是将键通过哈希函数映射到一个固定大小的数组中,而不是简单地按顺序存储。

Python2.x中如何使用hashlib模块进行哈希算法计算在Python编程中,哈希算法是一种常用的算法,用于生成数据的唯一标识。Python提供了hashlib模块来进行哈希算法的计算。本文将介绍如何使用hashlib模块进行哈希算法计算,并给出一些示例代码。hashlib模块是Python标准库中的一部分,提供了多种常见的哈希算法,如MD5、SH

PHP中的哈希算法详解在PHP开发中,哈希算法是常用的一种加密技术,它可以将任意长度的数据转化为固定长度的哈希值。哈希算法在密码学、数据完整性校验以及数据快速查找等方面都有着广泛的应用。在本文中,我们将详细介绍PHP中的哈希算法,并提供一些代码示例供参考。一、哈希算法的基本原理哈希算法通过对输入数据进行一系列的数学运算,生成一个固定长度的哈希值。具有以下基本

如何使用Python实现SHA哈希算法?SHA(安全散列算法)是一种常用的密码学哈希函数,它对任意长度的数据生成固定长度的唯一哈希值。Python中提供了hashlib模块,它包含了常用的哈希算法,包括SHA算法。本文将详细介绍如何使用Python实现SHA哈希算法,并提供相关的代码示例。首先,需要导入hashlib模块。以下是导入hashlib模块的代码:
