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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Golang は、豊富な標準ライブラリと組み込み関数を備えた新しい高性能プログラミング言語です。これらには、ファイル検証やデータ検証などのためにデータのハッシュ値を生成するために使用できるハッシュ関数が含まれます。この記事では、Golangでよく使われる関数hash、crc32、md5、sha1の計算方法と応用を紹介します。 1. ハッシュ関数 Golang のハッシュ関数には、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 ライブラリなどのサードパーティ ライブラリを使用できます。

Python の基盤技術が明らかに: ハッシュ テーブルの実装方法 ハッシュ テーブルは、コンピュータ分野で非常に一般的かつ重要なデータ構造であり、多数のキーと値のペアを効率的に格納および検索できます。 Pythonでは辞書を使ってハッシュテーブルを使うことができますが、その実装の詳細を深く理解している人はほとんどいません。この記事では、Python でのハッシュ テーブルの基盤となる実装テクノロジを明らかにし、具体的なコード例を示します。ハッシュ テーブルの中心的な考え方は、キーを単に順番に保存するのではなく、ハッシュ関数を通じて固定サイズの配列にキーをマップすることです。

Python 2.x でハッシュ アルゴリズム計算に hashlib モジュールを使用する方法: Python プログラミングでは、ハッシュ アルゴリズムは、データの一意の ID を生成するためによく使用されるアルゴリズムです。 Python は、ハッシュ アルゴリズムの計算を実行するための hashlib モジュールを提供します。この記事では、hashlib モジュールを使用してハッシュ アルゴリズムの計算を実行する方法といくつかのサンプル コードを紹介します。 hashlib モジュールは Python 標準ライブラリの一部であり、MD5、SH などのさまざまな一般的なハッシュ アルゴリズムを提供します。

Python を使用して SHA ハッシュ アルゴリズムを実装するにはどうすればよいですか? SHA (セキュア ハッシュ アルゴリズム) は、任意の長さのデータに対して固定長の一意のハッシュ値を生成する、一般的に使用される暗号化ハッシュ関数です。 hashlib モジュールは Python で提供されており、SHA アルゴリズムなどの一般的に使用されるハッシュ アルゴリズムが含まれています。この記事では、Python を使用して SHA ハッシュ アルゴリズムを実装する方法を詳しく紹介し、関連するコード例を示します。まず、hashlib モジュールをインポートする必要があります。以下は、hashlib モジュールをインポートするコードです。

PHP のハッシュ アルゴリズムの詳細な説明 ハッシュ アルゴリズムは、PHP 開発において一般的に使用される暗号化技術であり、任意の長さのデータを固定長のハッシュ値に変換できます。ハッシュ アルゴリズムは、暗号化、データ整合性検証、および高速データ検索で広く使用されています。この記事では、PHP のハッシュ アルゴリズムを詳しく紹介し、参考用のコード例をいくつか示します。 1. ハッシュ アルゴリズムの基本原理 ハッシュ アルゴリズムは、入力データに対して一連の数学演算を実行することにより、固定長のハッシュ値を生成します。以下の基本を持っていること

Java を使用して MD5 ハッシュ アルゴリズムを実装する方法 MD5 (MessageDigestAlgorithm5) は、データの暗号化と検証に使用される一般的に使用されるハッシュ アルゴリズムです。 Java では、MessageDigest クラスを使用して MD5 ハッシュ アルゴリズムを実装できます。以下は、Java を使用して MD5 アルゴリズムを実装する方法を示す簡単なサンプル コードです。 importjava.security.MessageDigest;

Java を使用して SHA ハッシュ アルゴリズムを実装する方法 SHA (SecureHashAlgorithm) は、任意の長さのデータを固定長のハッシュ値に変換するために使用される一般的に使用されるハッシュ アルゴリズムです。 Java では、Java 標準ライブラリの MessageDigest クラスを使用して SHA ハッシュ アルゴリズムを実装できます。以下では、Java で SHA ハッシュ アルゴリズムを実装する方法を詳しく紹介し、対応するコード例を添付します。まず、Java コードを記述する必要があります。
