`
核桃博客
  • 浏览: 10348 次
  • 来自: hetaoblog
文章分类
社区版块
存档分类
最新评论

说一说java里面的hashcode3-再说string-hashcode

 
阅读更多
http://www.hetaoblog.com/%E8%AF%B4%E4%B8%80%E8%AF%B4java%E9%87%8C%E9%9D%A2%E7%9A%84hashcode3-%E5%86%8D%E8%AF%B4string-hashcode/

前一篇文章说一说java里面的hashcode-string-hashcode, 这篇再多说一下这个String.hashcode(),

我看到String.hashcode()的冲突的时候,第一个想法就是,哈,那不是质数31取的太小了么?导致在常用ascii字符集里面容易冲突,那么,直接设个大点的质数不就好了么?幸运的是,257就是个质数,那么就用257,立刻就可以避免之前的冲突的例子了,下面是一段代码

@Test
public void testBetterhash()
{
    System.out.println(betterHash("Aa") + "," + betterHash("BB"));
    System.out.println(betterHash("Ba") + "," + betterHash("CB"));
    System.out.println(betterHash("Ca") + "," + betterHash("DB"));
    System.out.println(betterHash("Da") + "," + betterHash("EB"));
}
public static int betterHash(String s)
{
    int h = 0;
    int len = s.length();

    for (int i = 0; i < len; i++) {
        h = 257*h + s.charAt(i);
    }

    return h;
}

返回的结果很好,全部不冲突
16802,17028
17059,17285
17316,17542
17573,17799

不过悲剧的是,该算法相当于以257为进制,每次乘以257至少相当于移了8位多,在32位jdk下面,int只有32位,遇到5个字符就溢出了,调用betterHash("abcde")就会返回-372058641

所以,这个想法自然就失败了;
那么,原来的String.hashcode()算法在‘通常情况’下大约有多少的冲突概率呢?

为此,我从http://www.mieliestronk.com/wordlist.html下载了常用英文单词表,其中包含了将近6万个单词,我为了测试大小写排列组合的情况,取了前面5000个单词,然后对每个单词做大小写全排列,
也就是cat会有cat/caT/cAt/cAT/Cat/CaT/CAt/CAT 这8种情况,得到8021600个不同的字符串,分别计算他们的hashcode(),得到了8012142个不同的hashcode,也就是有9458 个冲突,在这样的场景下,大约有超过千分之一的冲突;

我想, jdk的实现肯定是经过了充分的考虑,考虑到大多数情况下能够在所有域上冲突能够做均匀分布;
分享到:
评论

相关推荐

    string-hashcode:java.lang.String.hashCode

    安装npm install string-hashcode 例子var hashCode = require ( 'string-hashcode' ) ;var s = 'abc' ;console . log ( s . hashCode ) ; // undefinedvar code = hashCode ( s ) ;console . log ( s . hashCode ) ...

    java中Hashcode的作用.docx

    3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。 Hashcode和equals方法的关系 Hashcode和...

    java 中HashCode重复的可能性

    HashCode 是 Java 中一个重要的概念,它用于标识对象的唯一性。然而,Hash Code 有可能重复,这会导致程序出错。下面我们将深入探讨 Java 中 HashCode 重复的可能性。 首先,让我们了解什么是 Hash Code。Hash ...

    javascript中实现兼容JAVA的hashCode算法代码分享

    Java中String类的hashCode方法采用特定的算法,即:初始时,哈希码值为0,然后以字符为单位,对于字符串中的每一个字符,都使用31乘以当前哈希码,然后加上当前字符的ASCII值,然后更新哈希码。 2. **JavaScript中...

    java中hashcode()和equals()方法详解

    在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    #### 一、`hashCode` `hashCode` 方法是 `Object` 类中的一个方法,用于返回对象的哈希码值。在 Java 中,哈希码经常被用于实现散列表(如 `HashMap` 和 `HashSet`)。为了确保散列表的正确性,重写 `equals` 方法...

    深入理解Java中HashCode方法

    3. 一个好的hashCode函数应该将不同的对象分布到所有可能的hashCode值上,以避免哈希碰撞。 在Java中,hashCode方法的实现方式有多种,例如,使用String类的hashCode方法,使用数学表达式来计算hashCode值。同时,...

    java中的String类常用方法解析(一)

    在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符...

    java中hashcode()和equals()的详解.docx

    在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及在Java集合框架...

    Java中equals,hashcode和==的区别

    Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个运算符,用于比较两个对象的内存地址是否...

    Java 基础(3-8) - 图谱 & Q-A.pdf

    `String`在Java中是不可变的,主要是为了线程安全和缓存`hashcode`。从Java 7开始,`switch`语句支持`String`类型。不可变对象意味着一旦创建,其状态不能改变,创建不可变对象通常使用私有构造函数和final字段。...

    练习JAVA语句中的String

    在Java编程语言中,`String`类是使用最广泛的类之一,主要用来处理文本字符串。字符串在Java中被视为不可变对象,这意味着一旦创建了一个`String`对象,就不能更改它的值。下面我们将深入探讨`String`类的一些关键...

    Java String对象的经典问题

    在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`对象被创建,它的内容就不能被改变。这种特性使得`String`类非常适合...

    Java核心知识总结-笔记

    String类在Java中扮演着至关重要的角色,因为它是最常用的数据类型之一,用于存储和处理文本信息。以下是对String类的详细分析: 1. **String的底层实现** - String对象基于`char[]`数组来存储字符序列。由于...

    java面试必看---基础

    3. **跨平台性**:Java的跨平台性基于“一次编写,到处运行”的理念,通过JVM将Java字节码转换为特定平台的机器码。 4. **Java语言特点**:包括自动内存管理(垃圾回收)、强类型、面向对象、异常处理、多线程等。 ...

    hashcode的作用

    在Java中,`hashCode()` 方法是 `Object` 类的一个重要成员方法,它返回一个整数,这个整数通常用来表示对象的哈希值。哈希值在Java集合框架中扮演着至关重要的角色,尤其是在散列表(如 `HashMap` 和 `Hashtable`)...

    java面试题资料-基础

    - 对于开发者来说,安装JDK是必须的,因为它提供了开发Java应用程序所需的环境。 **2.2 JRE(Java Runtime Environment)** - JRE是Java运行环境,包含了运行Java程序所需的所有组件,包括JVM(Java Virtual ...

Global site tag (gtag.js) - Google Analytics