php-perl哈希算法实现(times33哈希算法)_PHP
复制代码 代码如下:
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
* http://burtleburtle.net/bob/hash/hashfaq.html 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的http://burtleburtle.net/bob/hash/hashfaq.html,中对平方差的描述),数字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;

Python2.x中如何使用hashlib模組進行雜湊演算法計算在Python程式設計中,雜湊演算法是一種常用的演算法,用於產生資料的唯一識別。 Python提供了hashlib模組來進行哈希演算法的計算。本文將介紹如何使用hashlib模組進行哈希演算法計算,並給出一些範例程式碼。 hashlib模組是Python標準函式庫中的一部分,提供了多種常見的雜湊演算法,如MD5、SH

Python底層技術揭秘:如何實現哈希表哈希表是在電腦領域中十分常見且重要的資料結構,它可以有效率地儲存和找到大量的鍵值對。在Python中,我們可以使用字典來使用雜湊表,但是很少有人深入了解它的實作細節。本文將揭秘Python中哈希表的底層實作技術,並給出具體的程式碼範例。哈希表的核心思想是將鍵通過哈希函數映射到固定大小的數組中,而不是簡單地按順序存儲。

PHP中的雜湊演算法詳解在PHP開發中,雜湊演算法是常用的加密技術,它可以將任意長度的資料轉換成固定長度的雜湊值。哈希演算法在密碼學、資料完整性校驗以及資料快速查找等方面都有廣泛的應用。在本文中,我們將詳細介紹PHP中的雜湊演算法,並提供一些程式碼範例供參考。一、雜湊演算法的基本原理雜湊演算法透過對輸入資料進行一系列的數學運算,產生一個固定長度的雜湊值。具有以下基本

如何使用Python實作SHA雜湊演算法? SHA(安全雜湊演算法)是一種常用的密碼學雜湊函數,它對任意長度的資料產生固定長度的唯一雜湊值。 Python中提供了hashlib模組,它包含了常用的雜湊演算法,包括SHA演算法。本文將詳細介紹如何使用Python實作SHA雜湊演算法,並提供相關的程式碼範例。首先,需要導入hashlib模組。以下是導入hashlib模組的程式碼:

雜湊 又稱作 “散列”,它接收任何一組任意長度的輸入訊息,透過 雜湊 演算法變換成固定長度的資料指紋,該指紋就是 雜湊值。總體而言,哈希 可理解為一種訊息摘要。
