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 回答