• 88.字符串哈希表返数字


    常用字符串哈希函数有 BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。

     1 // BKDR Hash Function
     2 unsigned int BKDRHash(char *str)
     3 {
     4     unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
     5     unsigned int hash = 0;
     6  
     7     while (*str)
     8     {
     9         hash = hash * seed + (*str++);
    10     }
    11  
    12     return (hash & 0x7FFFFFFF);
    13 }
     1 unsigned int SDBMHash(char *str)
     2 {
     3     unsigned int hash = 0;
     4  
     5     while (*str)
     6     {
     7         // equivalent to: hash = 65599*hash + (*str++);
     8         hash = (*str++) + (hash << 6) + (hash << 16) - hash;
     9     }
    10  
    11     return (hash & 0x7FFFFFFF);
    12 }
      1 unsigned int SDBMHash(char *str)
      2 {
      3     unsigned int hash = 0;
      4  
      5     while (*str)
      6     {
      7         // equivalent to: hash = 65599*hash + (*str++);
      8         hash = (*str++) + (hash << 6) + (hash << 16) - hash;
      9     }
     10  
     11     return (hash & 0x7FFFFFFF);
     12 }
     13  
     14 // RS Hash Function
     15 unsigned int RSHash(char *str)
     16 {
     17     unsigned int b = 378551;
     18     unsigned int a = 63689;
     19     unsigned int hash = 0;
     20  
     21     while (*str)
     22     {
     23         hash = hash * a + (*str++);
     24         a *= b;
     25     }
     26  
     27     return (hash & 0x7FFFFFFF);
     28 }
     29  
     30 // JS Hash Function
     31 unsigned int JSHash(char *str)
     32 {
     33     unsigned int hash = 1315423911;
     34  
     35     while (*str)
     36     {
     37         hash ^= ((hash << 5) + (*str++) + (hash >> 2));
     38     }
     39  
     40     return (hash & 0x7FFFFFFF);
     41 }
     42  
     43 // P. J. Weinberger Hash Function
     44 unsigned int PJWHash(char *str)
     45 {
     46     unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
     47     unsigned int ThreeQuarters    = (unsigned int)((BitsInUnignedInt  * 3) / 4);
     48     unsigned int OneEighth        = (unsigned int)(BitsInUnignedInt / 8);
     49     unsigned int HighBits         = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
     50     unsigned int hash             = 0;
     51     unsigned int test             = 0;
     52  
     53     while (*str)
     54     {
     55         hash = (hash << OneEighth) + (*str++);
     56         if ((test = hash & HighBits) != 0)
     57         {
     58             hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
     59         }
     60     }
     61  
     62     return (hash & 0x7FFFFFFF);
     63 }
     64  
     65 // ELF Hash Function
     66 unsigned int ELFHash(char *str)
     67 {
     68     unsigned int hash = 0;
     69     unsigned int x    = 0;
     70  
     71     while (*str)
     72     {
     73         hash = (hash << 4) + (*str++);
     74         if ((x = hash & 0xF0000000L) != 0)
     75         {
     76             hash ^= (x >> 24);
     77             hash &= ~x;
     78         }
     79     }
     80  
     81     return (hash & 0x7FFFFFFF);
     82 }
     83  
     84 // BKDR Hash Function
     85 unsigned int BKDRHash(char *str)
     86 {
     87     unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
     88     unsigned int hash = 0;
     89  
     90     while (*str)
     91     {
     92         hash = hash * seed + (*str++);
     93     }
     94  
     95     return (hash & 0x7FFFFFFF);
     96 }
     97  
     98 // DJB Hash Function
     99 unsigned int DJBHash(char *str)
    100 {
    101     unsigned int hash = 5381;
    102  
    103     while (*str)
    104     {
    105         hash += (hash << 5) + (*str++);
    106     }
    107  
    108     return (hash & 0x7FFFFFFF);
    109 }
    110  
    111 // AP Hash Function
    112 unsigned int APHash(char *str)
    113 {
    114     unsigned int hash = 0;
    115     int i;
    116  
    117     for (i=0; *str; i++)
    118     {
    119         if ((i & 1) == 0)
    120         {
    121             hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
    122         }
    123         else
    124         {
    125             hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
    126         }
    127     }
    128  
    129     return (hash & 0x7FFFFFFF);
    130 }
  • 相关阅读:
    Spring注解@Resource和@Autowired区别对比
    Http请求中Content-Type讲解以及在Spring MVC中的应用
    解决SpringMVC的@ResponseBody返回中文乱码
    JVM之类加载器下篇
    JVM之类加载器中篇
    JVM之类加载器上篇
    HashMap的resize和Fail-Fast机制
    HashMap的实现原理
    Tomcat中JVM内存溢出及合理配置
    redis的主从复制,读写分离,主从切换
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8458626.html
Copyright © 2020-2023  润新知