当前位置: 首页 > 知识库问答 >
问题:

这个hashCode有意义吗?

金嘉言
2023-03-14

我遇到了一些哈希代码函数,它具有以下功能:

class MyClass{
   private String string;
   //..other data members and methods...
   public int hashCode()
   { 
        int result = 17;
        if(string != null)
        {
           result = result*31 + string.hashCode;
        }
        return result;
   }
};

我不完全相信用于计算hashCode的方法,我知道使用质数通常会产生更好的分布。但在这个实现中,我并不真的相信是这样的。

例如,假设一个标准的哈希实现,我会错过0到17*31之间的所有桶。

是不是有些微妙的地方我没看出来?

共有2个答案

漆雕修能
2023-03-14

您缺少溢出情况,这在hashCode实现中很可能发生。

特别是,string.hashCode可以是负数。

简意
2023-03-14

正如在Eclipse生成的hashCode函数有什么好处吗?这个hashCode函数匹配Java中内置的实现,并由Java合著者Joshua Bloch在《有效Java第9项》中推荐。这类似于注释文档,它为所有成员规定了一个哈希函数,即(成员值哈希码)xor(127*成员名称哈希码)的总和。通过选择素数开始——这里是17和31——哈希因子必然是相互关联的。

与Objects.hashCode文档中一样,重要的是hashCode在运行之间是一致的,与< code>equals一致,并且如果可行的话是不同的。

关于哈希代码设计的一个主要因素是哈希代码将环绕。如在哈希图的开放JDK8代码中:

Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
    (first = tab[(n - 1) & hash]) != null) {

表长度(必然是 2 的幂)成为 hashCode 的掩码:对于大小为 64 的哈希表,哈希得到的位掩码为 63, 0b00111111。给定素数“哈希涂抹”,这些低位将分布良好,不比单字段哈希函数中存在17和31个因子更多或更少,但如果将两个,三个或五十个字段全部组合成一个哈希函数,则特别具有优势。返回的哈希码的绝对大小无关紧要,只要哈希码的适当低位分布良好即可。

 类似资料:
  • 我的问题与这个关于ForkJoinPool和面向IO的操作的问题有些相关,但它稍微更一般(我链接到的问题没有得到明确的答案)。简而言之 - 如果我想并行发送许多HTTP请求,并且已经使用异步HTTP客户端(例如AsyncHttpClient),那么使用ForkJoinPool并行提交请求是否有意义? 最初,我认为这样做违背了使用异步HTTP客户端的目的,该客户端已经可以并行发送请求。然而,阅读这个

  • 我在wordpress中的裁剪图像中发现了一个奇怪的bug 我使用WP_Customize_crapped_Image_控件来裁剪图像。在那里我设置了750的宽度 这很好,但在裁剪其他图像时显示错误 *这让我发疯,花了这么多小时后,我意识到(错误,不显示裁剪帧)它发生与图像具有相同的宽高比,我在WP_Customize_Cropped_Image_Control提供(如果宽高比匹配,然后发生错误)

  • 关于函数的Perl6网站说 强制类型可以帮助您在例程中拥有特定类型,但可以接受更广泛的输入。调用例程时,参数将自动转换为较窄的类型。 这里Int是参数将被强制的目标类型,Cool是例程接受作为输入的类型。 但潜艇的意义何在?不就是一个?为什么要限制调用者为参数实现? 这个例子让我倍感困惑,因为已经

  • 问题内容: 对于仅字段为原始字段的类,例如: 这是一种合理的“足够好”的书写方式吗? 也就是说,我在使用的相同字段之外构造了一个,然后仅使用。 编辑: 我已经更新了我的问题,以包括一个字段。应该如何处理?只是让它溢出? 问题答案: 您的哈希码确实满足以下属性:如果两个对象相等,则它们的哈希码必须相等。因此,这样就足够了。但是,在哈希码中创建冲突非常简单,这会降低基于哈希的数据结构的性能。 但我会稍

  • 本文向大家介绍在c#中using和new这两个关键字有什么意义,请写出你所知道的意义相关面试题,主要包含被问及在c#中using和new这两个关键字有什么意义,请写出你所知道的意义时的应答技巧和注意事项,需要的朋友参考一下 答: using 引入名称空间或者使用非托管资源,使用完对象后自动执行实现了IDisposable接口的类的Dispose方法 new 新建实例或者隐藏父类方法

  • 问题内容: 当每个人都可以使用jarsigner签名时,像Java的jars一样对代码进行签名有什么意义?它如何提供安全性? 问题答案: 签名JAR文件的重点是验证它是否已被篡改。对jar文件进行签名后,您可以验证该文件未被其他人修改。这样可以确保文件源自最初签名的人。如果有人修改了文件,则签名验证过程将失败。您可以查看本文,以获取有关如何使用公钥加密执行数字签名的更多详细信息。