精华内容
下载资源
问答
  • 主要介绍了C#计算字符串哈希值(MD5、SHA)的方法,以实例形式较为详细的分析总结了C#计算字符串哈希值的各种常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 性能很高的计算字符串或文件hash值的函数,比md5速度快得多,自己一直用着,重复的几率为很底,一般的应用足够, var I64BIT_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'.split...
  • 用C语言实现常用的字符串哈希函数,比如RSHash、JSHash、PJWHash、FNVHash等
  • 它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 (1)基本概念 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树...

    一、布隆过滤器(Bloom Filter)

    在这里插入图片描述

    是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

    (1)基本概念
    如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

    (2)优点
    相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能。

    (3)缺点
    但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣。
    另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。在降低误算率方面,有不少工作,使得出现了很多布隆过滤器的变种。

    二、字符串转数字的一些hash函数

    算法大概有如下几种

    • BKDRHash
    • APHash
    • DJBHash
    • JSHash
    • RSHash
    • SDBMHash
    • PJWHash
    • ELFHash

    使用方法如下:

    var bling = require("bling-hashes");
    var hash = bling.bkdr("Hello world!"); 
    

    三、布隆过滤器(Bloom Filter)与Hash算法

    Hash算法在应用中又称为指纹(fingerprint)或者摘要(digest)算法,是一种将任意长度的明文串映射为较短的数据串(hash值)的算法,目前的Hash算法主要是MD5系列算法与SHA系统算法一个好的Hash算法需要具有四个特性,即正向快速 ,逆向困难,输入敏感 ,冲突避免。

    1. 正向快速 :给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值
    2. 逆向困难:给定Hash 值,在有限时间内难以逆推出明文
    3. 输入敏感:原始输入信息发生任何改变,新产生的 Hash 值都应该出现很大不同
    4. 冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致 。冲突避免也叫做抗碰撞性,分为强抗碰撞性与弱抗碰撞性。如果给定明文前提下,无法找到与之碰撞的其他明文,则算法具有弱抗碰撞性;如果无法找到任意两个Hash 碰撞的明文,则称算法具有强抗碰撞性

    由于Hash可以将任意内容映射到一个固定长度的字符串,而且不同内容映射到相同串的概率很低 。因此,这就构成了一个很好的“内容→索引”的生成关系。对于给定的内容与存储数组,可以通过构造合适的Hash函数,使内容计算得出的Hash值不超过数组的大小,从而实现快速的基于内容的查找,用以判断"某个元素是否在一个集合内"的问题。但是将映射的Hash值限制在数组大小的范围内,会造成大量的Hash冲突,从而导致性能的急速下降,所以人们基于Hash算法设计出了布隆过滤器

    布隆过滤器采用了多个 Hash 函数来提高空间利用率。 对同一个给定输入来说,多个Hash函数计算出多个地址,分别在数组的这些地址上标记为1,进行查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入,如下图所示,根据内容执行Hash1,Hash2,HashK等函数,计算出h1,h2,hk等位置,如果这些位置全部是1,则说明abc@gmail.com有很大概率存在

    在这里插入图片描述
    之所以说有很大概率,是因为不管是单一的Hash算法还是布隆过滤器,其思想是一致的,都是基于内容的编码,但是由于存储限制,都可能存在冲突,即两种方法都可能存在误报的问题,同时都不会存在错报的问题。不过在应用中布隆过滤器的误报率远低于单一Hash算法的误报率。

    为了答谢大家关注和支持,这次给大家准备了限时领取福利:阿里面试题、百度面试题、滴滴面试题、华为面试题、京东面试题、美团面试题、腾讯面试题、头条面试题、中兴面试题。
    在这里插入图片描述
    还等什么小编推荐自己的linuxC/C++语言交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!前100名进群领取,额外赠送一份价值199的C/C++、linux资料包含(视频教程、电子书、实战项目及代码),下面部分展示。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • js 字符串哈希函数

    2016-02-29 11:24:00
    * 获取字符串哈希值 * @param {String} str * @param {Boolean} caseSensitive * @return {Number} hashCode */ getHashCode:function(str,caseSensitive){ if(!caseSensitive){ str = str...

    废话不多说直接上代码

    /**
     * 获取字符串的哈希值
     * @param {String} str
     * @param {Boolean} caseSensitive
     * @return {Number} hashCode
     */
    getHashCode:function(str,caseSensitive){
        if(!caseSensitive){
            str = str.toLowerCase();
        }
        // 1315423911=b'1001110011001111100011010100111'
        var hash  =   1315423911,i,ch;
        for (i = str.length - 1; i >= 0; i--) {
            ch = str.charCodeAt(i);
            hash ^= ((hash << 5) + ch + (hash >> 2));
        }
         
        return  (hash & 0x7FFFFFFF);
    }
    简单讲讲过程

    首先由一个初始化的hash值,这个函数会对字符串中的每个字符进行运算
    返回就是一个长数字

    每次的运算过程

    在每次的运算中都会对hash值进行操作,每次都是hash值先位运算右移5得到到a,然后hash值位运算左移2得到b,然后加上a+b+c(循环中的单个字符的asc编码)得到d,最后运算d^hash值赋值给hash值。
    所以每次循环都会得到不同的hash值,下次运算的时候就会使用到这一次运算得到的hash。

    转载于:https://www.cnblogs.com/Silababy/p/5226886.html

    展开全文
  • 各种字符串哈希算法

    千次阅读 2013-12-04 09:05:01
    今天根据自己的理解重新整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下:  原文地址:http://blog.csdn.net/icefireelf/article/details/5796529           ...
    今天根据自己的理解重新整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下:

     原文地址:http://blog.csdn.net/icefireelf/article/details/5796529

     

     

     

     

     

    [cpp]  view plain copy
    1. /// @brief BKDR Hash Function  
    2. /// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。  
    3. template<class T>  
    4. size_t BKDRHash(const T *str)  
    5. {  
    6.     register size_t hash = 0;  
    7.     while (size_t ch = (size_t)*str++)  
    8.     {         
    9.         hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..  
    10.         // 有人说将乘法分解为位运算及加减法可以提高效率,如将上式表达为:hash = hash << 7 + hash << 1 + hash + ch;  
    11.         // 但其实在Intel平台上,CPU内部对二者的处理效率都是差不多的,  
    12.         // 我分别进行了100亿次的上述两种运算,发现二者时间差距基本为0(如果是Debug版,分解成位运算后的耗时还要高1/3);  
    13.         // 在ARM这类RISC系统上没有测试过,由于ARM内部使用Booth's Algorithm来模拟32位整数乘法运算,它的效率与乘数有关:  
    14.         // 当乘数8-31位都为1或0时,需要1个时钟周期  
    15.         // 当乘数16-31位都为1或0时,需要2个时钟周期  
    16.         // 当乘数24-31位都为1或0时,需要3个时钟周期  
    17.         // 否则,需要4个时钟周期  
    18.         // 因此,虽然我没有实际测试,但是我依然认为二者效率上差别不大          
    19.     }  
    20.     return hash;  
    21. }  
    22. /// @brief SDBM Hash Function  
    23. /// @detail 本算法是由于在开源项目SDBM(一种简单的数据库引擎)中被应用而得名,它与BKDRHash思想一致,只是种子不同而已。  
    24. template<class T>  
    25. size_t SDBMHash(const T *str)  
    26. {  
    27.     register size_t hash = 0;  
    28.     while (size_t ch = (size_t)*str++)  
    29.     {  
    30.         hash = 65599 * hash + ch;         
    31.         //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
    32.     }  
    33.     return hash;  
    34. }  
    35. /// @brief RS Hash Function  
    36. /// @detail 因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名。  
    37. template<class T>  
    38. size_t RSHash(const T *str)  
    39. {  
    40.     register size_t hash = 0;  
    41.     size_t magic = 63689;     
    42.     while (size_t ch = (size_t)*str++)  
    43.     {  
    44.         hash = hash * magic + ch;  
    45.         magic *= 378551;  
    46.     }  
    47.     return hash;  
    48. }  
    49. /// @brief AP Hash Function  
    50. /// @detail 由Arash Partow发明的一种hash算法。  
    51. template<class T>  
    52. size_t APHash(const T *str)  
    53. {  
    54.     register size_t hash = 0;  
    55.     size_t ch;  
    56.     for (long i = 0; ch = (size_t)*str++; i++)  
    57.     {  
    58.         if ((i & 1) == 0)  
    59.         {  
    60.             hash ^= ((hash << 7) ^ ch ^ (hash >> 3));  
    61.         }  
    62.         else  
    63.         {  
    64.             hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));  
    65.         }  
    66.     }  
    67.     return hash;  
    68. }  
    69. /// @brief JS Hash Function  
    70. /// 由Justin Sobel发明的一种hash算法。  
    71. template<class T>  
    72. size_t JSHash(const T *str)  
    73. {  
    74.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
    75.         return 0;  
    76.     register size_t hash = 1315423911;  
    77.     while (size_t ch = (size_t)*str++)  
    78.     {  
    79.         hash ^= ((hash << 5) + ch + (hash >> 2));  
    80.     }  
    81.     return hash;  
    82. }  
    83. /// @brief DEK Function  
    84. /// @detail 本算法是由于Donald E. Knuth在《Art Of Computer Programming Volume 3》中展示而得名。  
    85. template<class T>  
    86. size_t DEKHash(const T* str)  
    87. {  
    88.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
    89.         return 0;  
    90.     register size_t hash = 1315423911;  
    91.     while (size_t ch = (size_t)*str++)  
    92.     {  
    93.         hash = ((hash << 5) ^ (hash >> 27)) ^ ch;  
    94.     }  
    95.     return hash;  
    96. }  
    97. /// @brief FNV Hash Function  
    98. /// @detail Unix system系统中使用的一种著名hash算法,后来微软也在其hash_map中实现。  
    99. template<class T>  
    100. size_t FNVHash(const T* str)  
    101. {  
    102.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
    103.         return 0;  
    104.     register size_t hash = 2166136261;  
    105.     while (size_t ch = (size_t)*str++)  
    106.     {  
    107.         hash *= 16777619;  
    108.         hash ^= ch;  
    109.     }  
    110.     return hash;  
    111. }  
    112. /// @brief DJB Hash Function  
    113. /// @detail 由Daniel J. Bernstein教授发明的一种hash算法。  
    114. template<class T>  
    115. size_t DJBHash(const T *str)  
    116. {  
    117.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
    118.         return 0;  
    119.     register size_t hash = 5381;  
    120.     while (size_t ch = (size_t)*str++)  
    121.     {  
    122.         hash += (hash << 5) + ch;  
    123.     }  
    124.     return hash;  
    125. }  
    126. /// @brief DJB Hash Function 2  
    127. /// @detail 由Daniel J. Bernstein 发明的另一种hash算法。  
    128. template<class T>  
    129. size_t DJB2Hash(const T *str)  
    130. {  
    131.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
    132.         return 0;  
    133.     register size_t hash = 5381;  
    134.     while (size_t ch = (size_t)*str++)  
    135.     {  
    136.         hash = hash * 33 ^ ch;  
    137.     }  
    138.     return hash;  
    139. }  
    140. /// @brief PJW Hash Function  
    141. /// @detail 本算法是基于AT&T贝尔实验室的Peter J. Weinberger的论文而发明的一种hash算法。  
    142. template<class T>  
    143. size_t PJWHash(const T *str)  
    144. {  
    145.     static const size_t TotalBits       = sizeof(size_t) * 8;  
    146.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
    147.     static const size_t OneEighth       = TotalBits / 8;  
    148.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
    149.       
    150.     register size_t hash = 0;  
    151.     size_t magic = 0;     
    152.     while (size_t ch = (size_t)*str++)  
    153.     {  
    154.         hash = (hash << OneEighth) + ch;  
    155.         if ((magic = hash & HighBits) != 0)  
    156.         {  
    157.             hash = ((hash ^ (magic >> ThreeQuarters)) & (~HighBits));  
    158.         }  
    159.     }  
    160.     return hash;  
    161. }  
    162. /// @brief ELF Hash Function  
    163. /// @detail 由于在Unix的Extended Library Function被附带而得名的一种hash算法,它其实就是PJW Hash的变形。  
    164. template<class T>  
    165. size_t ELFHash(const T *str)  
    166. {  
    167.     static const size_t TotalBits       = sizeof(size_t) * 8;  
    168.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
    169.     static const size_t OneEighth       = TotalBits / 8;  
    170.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
    171.     register size_t hash = 0;  
    172.     size_t magic = 0;  
    173.     while (size_t ch = (size_t)*str++)  
    174.     {  
    175.         hash = (hash << OneEighth) + ch;  
    176.         if ((magic = hash & HighBits) != 0)  
    177.         {  
    178.             hash ^= (magic >> ThreeQuarters);  
    179.             hash &= ~magic;  
    180.         }         
    181.     }  
    182.     return hash;  
    183. }  

     

    我对这些hash的散列质量及效率作了一个简单测试,测试结果如下:

    测试1:对100000个由大小写字母与数字随机的ANSI字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

    字符串函数 冲突数 除1000003取余后的冲突数

    BKDRHash

    0 4826

    SDBMHash

    2 4814

    RSHash

    2 4886

    APHash

    0 4846

    ELFHash

    1515 6120

    JSHash

    779 5587

    DEKHash

    863 5643

    FNVHash

    2 4872

    DJBHash

    832 5645

    DJB2Hash

    695 5309

    PJWHash

    1515 6120

     

    测试2:对100000个由任意UNICODE组成随机字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

    字符串函数 冲突数 除1000003取余后的冲突数

    BKDRHash

    3 4710

    SDBMHash

    3 4904

    RSHash

    3 4822

    APHash

    2 4891

    ELFHash

    16 4869

    JSHash

    3 4812

    DEKHash

    1 4755

    FNVHash

    1 4803

    DJBHash

    1 4749

    DJB2Hash

    2 4817

    PJWHash

    16 4869

     

    测试3:对1000000个随机ANSI字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

    字符串函数 耗时(毫秒)

    BKDRHash

    109

    SDBMHash

    109

    RSHash

    124

    APHash

    187

    ELFHash

    249

    JSHash

    172

    DEKHash

    140

    FNVHash

    125

    DJBHash

    125

    DJB2Hash

    125

    PJWHash

    234

     

    结论:也许是我的样本存在一些特殊性,在对ASCII码字符串进行散列时,PJW与ELF Hash(它们其实是同一种算法)无论是质量还是效率,都相当糟糕;例如:"b5"与“aE",这两个字符串按照PJW散列出来的hash值就是一样的。 另外,其它几种依靠异或来散列的哈希函数,如:JS/DEK/DJB Hash,在对字母与数字组成的字符串的散列效果也不怎么好。相对而言,还是BKDR与SDBM这类简单的Hash效率与效果更好。

    其他

    作者:icefireelf

    出处:http://blog.csdn.net/icefireelf/article/details/5796529

    各种字符串Hash函数比较

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生 影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。

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

    Hash函数数据1数据2数据3数据4数据1得分数据2得分数据3得分数据4得分平均分
    BKDRHash 2 0 4774 481 96.55 100 90.95 82.05 92.64
    APHash 2 3 4754 493 96.55 88.46 100 51.28 86.28
    DJBHash 2 2 4975 474 96.55 92.31 0 100 83.43
    JSHash 1 4 4761 506 100 84.62 96.83 17.95 81.94
    RSHash 1 0 4861 505 100 100 51.58 20.51 75.96
    SDBMHash 3 2 4849 504 93.1 92.31 57.01 23.08 72.41
    PJWHash 30 26 4878 513 0 0 43.89 0 21.95
    ELFHash 30 26 4878 513 0 0 43.89 0 21.95

    其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与 1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。

    经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。APHash也 是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算 法本质是相似的。

     

    复制代码
    复制代码
    unsigned  int  SDBMHash( char   * str)
    {
        unsigned 
    int  hash  =   0 ;
     
        
    while  ( * str)
        {
            
    //  equivalent to: hash = 65599*hash + (*str++);
            hash  =  ( * str ++ +  (hash  <<   6 +  (hash  <<   16 -  hash;
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  RS Hash Function
    unsigned  int  RSHash( char   * str)
    {
        unsigned 
    int  b  =   378551 ;
        unsigned 
    int  a  =   63689 ;
        unsigned 
    int  hash  =   0 ;
     
        
    while  ( * str)
        {
            hash 
    =  hash  *  a  +  ( * str ++ );
            a 
    *=  b;
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  JS Hash Function
    unsigned  int  JSHash( char   * str)
    {
        unsigned 
    int  hash  =   1315423911 ;
     
        
    while  ( * str)
        {
            hash 
    ^=  ((hash  <<   5 +  ( * str ++ +  (hash  >>   2 ));
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  P. J. Weinberger Hash Function
    unsigned  int  PJWHash( char   * str)
    {
        unsigned 
    int  BitsInUnignedInt  =  (unsigned  int )( sizeof (unsigned  int *   8 );
        unsigned 
    int  ThreeQuarters     =  (unsigned  int )((BitsInUnignedInt   *   3 /   4 );
        unsigned 
    int  OneEighth         =  (unsigned  int )(BitsInUnignedInt  /   8 );
        unsigned 
    int  HighBits          =  (unsigned  int )( 0xFFFFFFFF <<  (BitsInUnignedInt  -  OneEighth);
        unsigned 
    int  hash              =   0 ;
        unsigned 
    int  test              =   0 ;
     
        
    while  ( * str)
        {
            hash 
    =  (hash  <<  OneEighth)  +  ( * str ++ );
            
    if  ((test  =  hash  &  HighBits)  !=   0 )
            {
                hash 
    =  ((hash  ^  (test  >>  ThreeQuarters))  &  ( ~ HighBits));
            }
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  ELF Hash Function
    unsigned  int  ELFHash( char   * str)
    {
        unsigned 
    int  hash  =   0 ;
        unsigned 
    int  x     =   0 ;
     
        
    while  ( * str)
        {
            hash 
    =  (hash  <<   4 +  ( * str ++ );
            
    if  ((x  =  hash  &   0xF0000000L !=   0 )
            {
                hash 
    ^=  (x  >>   24 );
                hash 
    &=   ~ x;
            }
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  BKDR Hash Function
    unsigned  int  BKDRHash( char   * str)
    {
        unsigned 
    int  seed  =   131 //  31 131 1313 13131 131313 etc..
        unsigned  int  hash  =   0 ;
     
        
    while  ( * str)
        {
            hash 
    =  hash  *  seed  +  ( * str ++ );
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  DJB Hash Function
    unsigned  int  DJBHash( char   * str)
    {
        unsigned 
    int  hash  =   5381 ;
     
        
    while  ( * str)
        {
            hash 
    +=  (hash  <<   5 +  ( * str ++ );
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
     
    //  AP Hash Function
    unsigned  int  APHash( char   * str)
    {
        unsigned 
    int  hash  =   0 ;
        
    int  i;
     
        
    for  (i = 0 * str; i ++ )
        {
            
    if  ((i  &   1 ==   0 )
            {
                hash 
    ^=  ((hash  <<   7 ^  ( * str ++ ^  (hash  >>   3 ));
            }
            
    else
            {
                hash 
    ^=  ( ~ ((hash  <<   11 ^  ( * str ++ ^  (hash  >>   5 )));
            }
        }
     
        
    return  (hash  &   0x7FFFFFFF );
    }
    复制代码
    复制代码

     

    http://www.byvoid.com/blog/string-hash-compare/

    展开全文
  • 字符串哈希算法——BKDRHash

    千次阅读 2018-09-01 20:42:13
    BYVoid对常用的几种字符串哈希函数进行了一次小小的评测。其评测结果,按照得分从高到低依次为...其中,最优的字符串哈希算法BKDRHash函数实现如下: // BKDR Hash Function unsigned int BKDRHash(char *str) { ...

    BYVoid对常用的几种字符串哈希函数进行了一次小小的评测。其评测结果,按照得分从高到低依次为BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash。

    其中,最优的字符串哈希算法BKDRHash函数实现如下:

    // BKDR Hash Function
    unsigned int BKDRHash(const char *str)
    {
        unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
        unsigned int hash = 0;
    
        while (*str){
            hash = hash * seed + (*str++);
        }
    
        return (hash & 0x7FFFFFFF);
    }

    比如,哈希字符串“Hello,World!”将会得到数字“632968537”。


    ©qingdujun
    2018-9-1 于 北京 海淀

    References:
    [1] https://www.byvoid.com/zhs/blog/string-hash-compare

    展开全文
  • 字符串哈希到整数函数,算法

    万次阅读 2014-05-11 16:43:54
    基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key...在处理大规模字符串数据时,
  • 字符串哈希算法

    2013-12-10 19:32:53
    2./// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。  3....
  • ELFhash - 优秀的字符串哈希算法 2016年10月29日 22:12:37 阅读数:6440更多 个人分类: 算法杂论 算法精讲 数据结构 所属专栏: 算法与数据结构 版权声明:本文为博主原创文章,未经博主允许不得转载...
  • 使用伯恩斯坦流行的“ times 33”哈希算法,但返回十六进制字符串而不是数字 这只是的方便包装。 安装 使用安装short-hash : npm install --save short-hash 用法 模块使用 var shortHash = require ( 'short-hash...
  • 字符串哈希函数

    千次阅读 2019-01-23 11:05:11
    本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法。 2、概念 哈希之所以广泛存在,是因为它能在绝大多数情况下可以在O(1)的时间复杂度中完成元素的查找。它的...
  • 先把这个元素作为k个哈希函数的输入,拿到k个数组位置,然后把所有的这些位置置为1。
  • 双旋转字符串 字符串哈希Hashing a string means decoding it to a certain other string of alphanumeric characters depending on the hashing algorithm used. The reason why hashing is done is to provide ...
  • :locked: 遵循PHC字符串格式的Node.JS Argon2密码哈希算法。 编码为 :red_heart: 作者( 。 PHC字符串格式 PHC字符串格式是一种尝试,它指定一种公共哈希字符串格式,该格式是Modular Crypt Format的受限且定义明确...
  • 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。 Hash函数 数据1 数据2 数据3 数据4...
  • 字符串哈希到整数函数的算法

    千次阅读 2015-03-26 16:52:19
    基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X...在处理大规模字符串数据
  • 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。 具体C语言实现: // SDBMHash unsigned int SDBMHash(char *str)  {   unsigned int hash = 0;  ...
  • 字符串哈希(1) 哈希函数 2. 字符串哈希 一个比较特殊的字符串匹配问题:在多个字符串中尽快操作某个字符串。如果字符串的规模很大,访问速度就非常关键。具体例子如 HDU 2648 Shopping 。 解决这个问题,最有效率...
  • js字符串hash加密

    千次阅读 2019-06-13 12:15:00
    String.prototype.hashCode = function(){ if (Array.prototype.reduce){ return this.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); ...
  • 这里选取了几种常用的字符串哈希,包括BKDRHash,APHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash和DJBHash,通过在不同的字符串集合测试,来测试其性能。 各种常用算法 一、BKD...
  • 它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 基本概念 编辑 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,025
精华内容 6,010
关键字:

js字符串哈希算法转数字