2
   1. static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength)
   2. {
   3.     register ulong hash = 5381;
   4.  
   5.     /* variant with the hash unrolled eight times */
   6.     for (; nKeyLength >= 8; nKeyLength -= 8) {
   7.         hash = ((hash << 5) + hash) + *arKey++;
   8.         hash = ((hash << 5) + hash) + *arKey++;
   9.         hash = ((hash << 5) + hash) + *arKey++;
  10.         hash = ((hash << 5) + hash) + *arKey++;
  11.         hash = ((hash << 5) + hash) + *arKey++;
  12.         hash = ((hash << 5) + hash) + *arKey++;
  13.         hash = ((hash << 5) + hash) + *arKey++;
  14.         hash = ((hash << 5) + hash) + *arKey++;
  15.     }
  16.     switch (nKeyLength) {
  17.         case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  18.         case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  19.         case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  20.         case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  21.         case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  22.         case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
  23.         case 1: hash = ((hash << 5) + hash) + *arKey++; break;
  24.         case 0: break;
  25. EMPTY_SWITCH_DEFAULT_CASE()
  26.     }
  27.     return hash;
  28. }
4

2 に答える 2

4

すべてのハッシュテーブルはそのハッシュアルゴリズムを使用します。PHPのハッシュテーブルは、たとえば、配列やシンボルテーブルなどを実装するために使用されます。

ヘッダーで示されているアルゴリズムは、DJBX33A(Daniel J. Bernstein、Times 33 with Addition)です。

于 2010-11-19T07:52:58.607 に答える
1

このリンクを使用して、この関数が使用されている場所を確認できます: http://lxr.php.net/search?q=+zend_inline_hash_func&defs=&refs=&path=&hist=&project=PHP_5_4

この関数が使用されている 3 つの php 拡張機能 (標準を含む) があるようです。

于 2013-03-18T20:49:39.857 に答える