PHP文字列ハッシュ関数アルゴリズムの実装コード

WBOY
リリース: 2016-07-25 08:54:30
オリジナル
1379 人が閲覧しました
  1. function DJBHash($str) // 0.22
  2. {
  3. $hash = 0;
  4. $n = strlen($str);
  5. for ($i = 0; $i {
  6. $hash += ($hash }
  7. return $hash % 701819;
  8. }
  9. function ELFHash($str) // 0.35
  10. {
  11. $hash = $x = 0;
  12. $n = strlen($str);
  13. for ($i = 0; $i {
  14. $hash = ($hash $hash &= ~$x;
  15. }
  16. }
  17. return $hash % 701819;
  18. }
  19. function JSHash($str) // 0.23
  20. {
  21. $hash = 0;
  22. $n = strlen($str);
  23. for ($i = 0; $i {
  24. $hash ^= (($hash > ; 2));
  25. }
  26. return $hash % 701819;
  27. }
  28. function SDBMHash($str) // 0.23
  29. {
  30. $hash = 0 ;
  31. $n = strlen($str);
  32. for ($ i = 0; $i {
  33. $hash = ord($str[$i]) + ($hash }
  34. return $hash % 701819;
  35. }
  36. function APHash($str) // 0.30
  37. {
  38. $hash = 0 ;
  39. $n = strlen($str);
  40. for ($i = 0; $i {
  41. if (($i & 1 ) == 0 )
  42. {
  43. $hash ^= (($hash }
  44. else
  45. {
  46. $hash ^= ( ~ (($hash <<11 ) ^ ord($str[$i]) ^ ($hash>> 5)));
  47. }
  48. }
  49. return $hash % 701819;
  50. }
  51. function DEKHash($str) // 0.23
  52. {
  53. $n = strlen($str);
  54. $hash = $n;
  55. for ($i = 0 ; $i {
  56. $hash = (($hash > 27)) ^ ord($str[$i]);
  57. }
  58. return $hash % 701819;
  59. }
  60. function FNVHash($str) // 0.31
  61. {
  62. $hash = 0;
  63. $n = strlen($str);
  64. for ($i = 0; $i < ;$n; $i++)
  65. {
  66. $hash *= 0x811C9DC5;
  67. $hash ^= ord($str[$i]);
  68. }
  69. return $hash % 701819;
  70. }
  71. 関数 PJWHash($str ) // 0.33
  72. {
  73. $hash = $test = 0;
  74. $n = strlen($str);
  75. for ($i = 0; $i {
  76. $hash = ($hash <<4) + ord($str[$i]);
  77. if(($test = $hash & -268435456) != 0)
  78. {
  79. $hash = (( $hash ^ ( $test>> 24)) & (~-268435456));
  80. }
  81. }
  82. return $hash % 701819;
  83. }
  84. function PHPHash($str) // 0.34
  85. {
  86. $hash = 0;
  87. $n = strlen($str);
  88. for ($i = 0; $i <$n; $i++)
  89. {
  90. $hash = ($hash <<4) + ord($str[$ i]);
  91. if (($g = ($hash & 0xF0000000)))
  92. {
  93. $hash = $hash ^ ($g>> 24);
  94. $hash = $hash ^ $g;
  95. }
  96. }
  97. return $hash % 701819;
  98. }
  99. function OpenSSLHash($str) // 0.22
  100. {
  101. $hash = 0;
  102. $n = strlen($str);
  103. for ($i = 0; $i {
  104. $hash ^= (ord($str[$i]) <<($i & 0x0f));
  105. }
  106. return $hash % 701819;
  107. }
  108. function MD5Hash($str ) // 0.050
  109. {
  110. $hash = md5($str);
  111. $hash = $hash[0] | ($hash[1] return $hash % 701819;
  112. }
复制代码

アルゴリズムの説明: 関数の後ろのコメントは、私のローカルテストでの実行速度 (単位: s) が 1000 倍であることがわかります。MD5Hash が最も速く、他の関数よりもはるかに高速であることがわかります。この関数のアルゴリズムでは、md5 以降の文字列の最初の 7 文字のみに依存します。つまり、最初の 7 文字が同じであれば、取得されるハッシュ値はまったく同じになります。あまり信頼できません....32文字に基づいて計算すると、速度は他のアルゴリズムよりもはるかに遅くなります...

MD5Hash を除いて、他のアルゴリズムは文字列の長さの影響を受けます。テストでは英語で 10 文字を使用しました。 各関数の最終的な戻り値 $hash % 701819; 701819 はハッシュの最大容量を表しており、これらのハッシュ関数によって得られる最終的な数値範囲は 0 ~ 701819 を使用することが一般的であると考えられます。素数の結果の分布は比較的均一になります。701819 に近い値としては、175447、350899、1403641、2807303、5614657 があります。

これは何に使えるの...

なぜこれらのハッシュ アルゴリズムを整理してテストする必要があるのでしょうか? 私はマルチユーザー ブログを書いています。前回のブログでも述べましたが、これは一般にユーザーを使用する機能です。ブログアドレスとして英語と数字を組み合わせた名前 (第 2 レベルのドメイン名またはディレクトリ)。次に、ユーザー名に基づいてユーザーの ID を取得する方法について質問があります。もう 1 つのクエリはありますか?ハッシュ関数を使えば、ユーザー名を加工して数値を取得し、その数値に対して何らかの処理をする必要がありません(2桁を基準に階層ディレクトリに分けています。目的はそれを防ぐためです)。 1 つのディレクトリに多数のファイルを格納すると (ディスクの取得速度に影響します)、パスが形成され、対応する ID がこのパスの下のファイルに保存されます (個人的にはファイル名としてユーザー名を推奨します)。ユーザーの ID はユーザー名に基づいて直接取得でき、クエリは必要ありません。ユーザー名はファイル名として使用されるため、最終結果が同じであっても、それらは異なるファイルに存在するため、必要はありません。衝突を心配するため。

もちろん...あなたのシステムが完全にユーザー名に基づいて動作する場合、私はこれを前に言いませんでした = =b、私は静かに SELECT を批判します。なぜなら数値は文字列よりも速いからです。

私は DJB アルゴリズムを選択しました。オンライン化後に MD5 配布テストが許容される場合は、それに切り替えることを検討します。

ここから、ハッシュが実際に分散に非常に役立つこともわかります。笑、分散ストレージを必要とするキャッシュ、静的、その他の用途に使用できます。



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート