常用Hash算法(C语言实现)

来源:互联网 发布:淘宝异地客服是真的吗 编辑:程序博客网 时间:2024/06/06 08:34

转载自:http://blog.csdn.net/huangkangying/article/details/8748537


以下代码来自:http://www.partow.net/programming/hashfunctions/index.html

[cpp] view plaincopy
  1. #include "GeneralHashFunctions.h"  
  2.   
  3. unsigned int RSHash(char* str, unsigned int len)  
  4. {  
  5.    unsigned int b    = 378551;  
  6.    unsigned int a    = 63689;  
  7.    unsigned int hash = 0;  
  8.    unsigned int i    = 0;  
  9.   
  10.    for(i = 0; i < len; str++, i++)  
  11.    {  
  12.       hash = hash * a + (*str);  
  13.       a    = a * b;  
  14.    }  
  15.   
  16.    return hash;  
  17. }  
  18. /* End Of RS Hash Function */  
  19.   
  20.   
  21. unsigned int JSHash(char* str, unsigned int len)  
  22. {  
  23.    unsigned int hash = 1315423911;  
  24.    unsigned int i    = 0;  
  25.   
  26.    for(i = 0; i < len; str++, i++)  
  27.    {  
  28.       hash ^= ((hash << 5) + (*str) + (hash >> 2));  
  29.    }  
  30.   
  31.    return hash;  
  32. }  
  33. /* End Of JS Hash Function */  
  34.   
  35.   
  36. unsigned int PJWHash(char* str, unsigned int len)  
  37. {  
  38.    const unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8);  
  39.    const unsigned int ThreeQuarters     = (unsigned int)((BitsInUnsignedInt  * 3) / 4);  
  40.    const unsigned int OneEighth         = (unsigned int)(BitsInUnsignedInt / 8);  
  41.    const unsigned int HighBits          = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);  
  42.    unsigned int hash              = 0;  
  43.    unsigned int test              = 0;  
  44.    unsigned int i                 = 0;  
  45.   
  46.    for(i = 0; i < len; str++, i++)  
  47.    {  
  48.       hash = (hash << OneEighth) + (*str);  
  49.   
  50.       if((test = hash & HighBits)  != 0)  
  51.       {  
  52.          hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));  
  53.       }  
  54.    }  
  55.   
  56.    return hash;  
  57. }  
  58. /* End Of  P. J. Weinberger Hash Function */  
  59.   
  60.   
  61. unsigned int ELFHash(char* str, unsigned int len)  
  62. {  
  63.    unsigned int hash = 0;  
  64.    unsigned int x    = 0;  
  65.    unsigned int i    = 0;  
  66.   
  67.    for(i = 0; i < len; str++, i++)  
  68.    {  
  69.       hash = (hash << 4) + (*str);  
  70.       if((x = hash & 0xF0000000L) != 0)  
  71.       {  
  72.          hash ^= (x >> 24);  
  73.       }  
  74.       hash &= ~x;  
  75.    }  
  76.   
  77.    return hash;  
  78. }  
  79. /* End Of ELF Hash Function */  
  80.   
  81.   
  82. unsigned int BKDRHash(char* str, unsigned int len)  
  83. {  
  84.    unsigned int seed = 131; /* 31 131 1313 13131 131313 etc.. */  
  85.    unsigned int hash = 0;  
  86.    unsigned int i    = 0;  
  87.   
  88.    for(i = 0; i < len; str++, i++)  
  89.    {  
  90.       hash = (hash * seed) + (*str);  
  91.    }  
  92.   
  93.    return hash;  
  94. }  
  95. /* End Of BKDR Hash Function */  
  96.   
  97.   
  98. unsigned int SDBMHash(char* str, unsigned int len)  
  99. {  
  100.    unsigned int hash = 0;  
  101.    unsigned int i    = 0;  
  102.   
  103.    for(i = 0; i < len; str++, i++)  
  104.    {  
  105.       hash = (*str) + (hash << 6) + (hash << 16) - hash;  
  106.    }  
  107.   
  108.    return hash;  
  109. }  
  110. /* End Of SDBM Hash Function */  
  111.   
  112.   
  113. unsigned int DJBHash(char* str, unsigned int len)  
  114. {  
  115.    unsigned int hash = 5381;  
  116.    unsigned int i    = 0;  
  117.   
  118.    for(i = 0; i < len; str++, i++)  
  119.    {  
  120.       hash = ((hash << 5) + hash) + (*str);  
  121.    }  
  122.   
  123.    return hash;  
  124. }  
  125. /* End Of DJB Hash Function */  
  126.   
  127.   
  128. unsigned int DEKHash(char* str, unsigned int len)  
  129. {  
  130.    unsigned int hash = len;  
  131.    unsigned int i    = 0;  
  132.   
  133.    for(i = 0; i < len; str++, i++)  
  134.    {  
  135.       hash = ((hash << 5) ^ (hash >> 27)) ^ (*str);  
  136.    }  
  137.    return hash;  
  138. }  
  139. /* End Of DEK Hash Function */  
  140.   
  141.   
  142. unsigned int BPHash(char* str, unsigned int len)  
  143. {  
  144.    unsigned int hash = 0;  
  145.    unsigned int i    = 0;  
  146.    for(i = 0; i < len; str++, i++)  
  147.    {  
  148.       hash = hash << 7 ^ (*str);  
  149.    }  
  150.   
  151.    return hash;  
  152. }  
  153. /* End Of BP Hash Function */  
  154.   
  155.   
  156. unsigned int FNVHash(char* str, unsigned int len)  
  157. {  
  158.    const unsigned int fnv_prime = 0x811C9DC5;  
  159.    unsigned int hash      = 0;  
  160.    unsigned int i         = 0;  
  161.   
  162.    for(i = 0; i < len; str++, i++)  
  163.    {  
  164.       hash *= fnv_prime;  
  165.       hash ^= (*str);  
  166.    }  
  167.   
  168.    return hash;  
  169. }  
  170. /* End Of FNV Hash Function */  
  171.   
  172.   
  173. unsigned int APHash(char* str, unsigned int len)  
  174. {  
  175.    unsigned int hash = 0xAAAAAAAA;  
  176.    unsigned int i    = 0;  
  177.   
  178.    for(i = 0; i < len; str++, i++)  
  179.    {  
  180.       hash ^= ((i & 1) == 0) ? (  (hash <<  7) ^ (*str) * (hash >> 3)) :  
  181.                                (~((hash << 11) + ((*str) ^ (hash >> 5))));  
  182.    }  
  183.   
  184.    return hash;  
  185. }  
  186. /* End Of AP Hash Function */  

原创粉丝点击