zoukankan      html  css  js  c++  java
  • string hashcode 解读

       偶尔看到string hashcode方法如下

              

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

    以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。 ASCII码见 http://blog.csdn.net/lucky_bo/article/details/52247939

    哈希计算公式可以计为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

    用31做基础 ,主要是因为31是一个奇质数,所以31*i=32*i-i=(i<<5)-i,这种位移与减法结合的计算相比一般的运算快很多。 参考stackworkflow ,

    hashmap的hashcode也是如此

    注意上面代码有两个问题: 

    1.hash码采用int 保存 可能会又重复 

    System.out.println("ABCDEa123abc".hashCode()); // 165374702
    System.out.println("ABCDFB123abc".hashCode()); // 165374702

    2.对入具有reverse关系的字符串 会返回相同的hashcode  如:  字符串"gdejicbegh"与字符串"hgebcijedg"具有相同的hashCode()返回值-801038016

     这里扩展一下 关于字符串的reverse方法 jdk中提供Stringbuffer的reverse方法 采用unicode代理解决  参考此链接 http://www.importnew.com/501.html

  • 相关阅读:
    Android studio 中国的垃圾问题解决
    实现一个简单的boot
    代理下载android4.4源代码
    《程序员在第一季度追姐姐的书》——提升自己的形象气质
    第46周四
    Spring单例与线程安全小结
    2014第46周二
    第46周一
    第45周日
    第45周六
  • 原文地址:https://www.cnblogs.com/zyzcj/p/8117695.html
Copyright © 2011-2022 走看看