Author: General Purpose C Hash Function Algorithms Library Language: text
Description: General Purpose C Hash Function Algorithms Library Timestamp: 2018-03-18 02:44:28 +0000
View raw paste Reply
  1. /*
  2.  **************************************************************************
  3.  *                                                                        *
  4.  *          General Purpose Hash Function Algorithms Library              *
  5.  *                                                                        *
  6.  * Author: Arash Partow - 2002                                            *
  7.  * URL: http://www.partow.net                                             *
  8.  * URL: http://www.partow.net/programming/hashfunctions/index.html        *
  9.  *                                                                        *
  10.  * Copyright notice:                                                      *
  11.  * Free use of the General Purpose Hash Function Algorithms Library is    *
  12.  * permitted under the guidelines and in accordance with the MIT License. *
  13.  * http://www.opensource.org/licenses/MIT                                 *
  14.  *                                                                        *
  15.  **************************************************************************
  16. */
  17.  
  18.  
  19. #include "GeneralHashFunctions.h"
  20.  
  21.  
  22. unsigned int RSHash(const char* str, unsigned int len)
  23. {
  24.    unsigned int b    = 378551;
  25.    unsigned int a    = 63689;
  26.    unsigned int hash = 0;
  27.    unsigned int i    = 0;
  28.  
  29.    for(i = 0; i < len; str++, i++)
  30.    {
  31.       hash = hash * a + (*str);
  32.       a    = a * b;
  33.    }
  34.  
  35.    return hash;
  36. }
  37. /* End Of RS Hash Function */
  38.  
  39.  
  40. unsigned int JSHash(const char* str, unsigned int len)
  41. {
  42.    unsigned int hash = 1315423911;
  43.    unsigned int i    = 0;
  44.  
  45.    for(i = 0; i < len; str++, i++)
  46.    {
  47.       hash ^= ((hash << 5) + (*str) + (hash >> 2));
  48.    }
  49.  
  50.    return hash;
  51. }
  52. /* End Of JS Hash Function */
  53.  
  54.  
  55. unsigned int PJWHash(const char* str, unsigned int len)
  56. {
  57.    const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);
  58.    const unsigned int ThreeQuarters     = (unsigned int)((BitsInUnsignedInt  * 3) / 4);
  59.    const unsigned int OneEighth         = (unsigned int)(BitsInUnsignedInt / 8);
  60.    const unsigned int HighBits          = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);
  61.    unsigned int hash              = 0;
  62.    unsigned int test              = 0;
  63.    unsigned int i                 = 0;
  64.  
  65.    for(i = 0; i < len; str++, i++)
  66.    {
  67.       hash = (hash << OneEighth) + (*str);
  68.  
  69.       if((test = hash & HighBits)  != 0)
  70.       {
  71.          hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
  72.       }
  73.    }
  74.  
  75.    return hash;
  76. }
  77. /* End Of  P. J. Weinberger Hash Function */
  78.  
  79.  
  80. unsigned int ELFHash(const char* str, unsigned int len)
  81. {
  82.    unsigned int hash = 0;
  83.    unsigned int x    = 0;
  84.    unsigned int i    = 0;
  85.  
  86.    for(i = 0; i < len; str++, i++)
  87.    {
  88.       hash = (hash << 4) + (*str);
  89.       if((x = hash & 0xF0000000L) != 0)
  90.       {
  91.          hash ^= (x >> 24);
  92.       }
  93.       hash &= ~x;
  94.    }
  95.  
  96.    return hash;
  97. }
  98. /* End Of ELF Hash Function */
  99.  
  100.  
  101. unsigned int BKDRHash(const char* str, unsigned int len)
  102. {
  103.    unsigned int seed = 131; /* 31 131 1313 13131 131313 etc.. */
  104.    unsigned int hash = 0;
  105.    unsigned int i    = 0;
  106.  
  107.    for(i = 0; i < len; str++, i++)
  108.    {
  109.       hash = (hash * seed) + (*str);
  110.    }
  111.  
  112.    return hash;
  113. }
  114. /* End Of BKDR Hash Function */
  115.  
  116.  
  117. unsigned int SDBMHash(const char* str, unsigned int len)
  118. {
  119.    unsigned int hash = 0;
  120.    unsigned int i    = 0;
  121.  
  122.    for(i = 0; i < len; str++, i++)
  123.    {
  124.       hash = (*str) + (hash << 6) + (hash << 16) - hash;
  125.    }
  126.  
  127.    return hash;
  128. }
  129. /* End Of SDBM Hash Function */
  130.  
  131.  
  132. unsigned int DJBHash(const char* str, unsigned int len)
  133. {
  134.    unsigned int hash = 5381;
  135.    unsigned int i    = 0;
  136.  
  137.    for(i = 0; i < len; str++, i++)
  138.    {
  139.       hash = ((hash << 5) + hash) + (*str);
  140.    }
  141.  
  142.    return hash;
  143. }
  144. /* End Of DJB Hash Function */
  145.  
  146.  
  147. unsigned int DEKHash(const char* str, unsigned int len)
  148. {
  149.    unsigned int hash = len;
  150.    unsigned int i    = 0;
  151.  
  152.    for(i = 0; i < len; str++, i++)
  153.    {
  154.       hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);
  155.    }
  156.    return hash;
  157. }
  158. /* End Of DEK Hash Function */
  159.  
  160.  
  161. unsigned int BPHash(const char* str, unsigned int len)
  162. {
  163.    unsigned int hash = 0;
  164.    unsigned int i    = 0;
  165.    for(i = 0; i < len; str++, i++)
  166.    {
  167.       hash = hash << 7 ^ (*str);
  168.    }
  169.  
  170.    return hash;
  171. }
  172. /* End Of BP Hash Function */
  173.  
  174.  
  175. unsigned int FNVHash(const char* str, unsigned int len)
  176. {
  177.    const unsigned int fnv_prime = 0x811C9DC5;
  178.    unsigned int hash      = 0;
  179.    unsigned int i         = 0;
  180.  
  181.    for(i = 0; i < len; str++, i++)
  182.    {
  183.       hash *= fnv_prime;
  184.       hash ^= (*str);
  185.    }
  186.  
  187.    return hash;
  188. }
  189. /* End Of FNV Hash Function */
  190.  
  191.  
  192. unsigned int APHash(const char* str, unsigned int len)
  193. {
  194.    unsigned int hash = 0xAAAAAAAA;
  195.    unsigned int i    = 0;
  196.  
  197.    for(i = 0; i < len; str++, i++)
  198.    {
  199.       hash ^= ((i & 1) == 0) ? (  (hash <<  7) ^ (*str) * (hash >> 3)) :
  200.                                (~((hash << 11) + ((*str) ^ (hash >> 5))));
  201.    }
  202.  
  203.    return hash;
  204. }
  205. /* End Of AP Hash Function */
View raw paste Reply