为什么 Objects.hash() 对于相同的输入返回不同的值?

2023-11-23

我运行了以下脚本(java),它给了我奇怪的结果。 有谁可以帮忙解释一下吗?

import java.util.Objects;
import org.apache.log4j.Logger;

public class CacheTester {

private static final Logger log = Logger.getLogger(CacheTester.class);

    @Test
    public void hashCodeTest() {
        for (int i = 0; i < 50; i++) {
            // if I remove the third parameter, it works fine
            log.info(Objects.hash("getDemoCache", "1", new int[]{1, 2}));
        }
    }
}

日志结果(它们彼此不同):

//...
2015-04-29 17:43:20 INFO  CacheTester:42 - 1431904540
2015-04-29 17:43:20 INFO  CacheTester:42 - 1859187447
2015-04-29 17:43:20 INFO  CacheTester:42 - -2146933580
2015-04-29 17:43:20 INFO  CacheTester:42 - -2074242201
2015-04-29 17:43:20 INFO  CacheTester:42 - 1363170000
2015-04-29 17:43:20 INFO  CacheTester:42 - 1040980265
2015-04-29 17:43:20 INFO  CacheTester:42 - 1639331053
2015-04-29 17:43:20 INFO  CacheTester:42 - 570765746
2015-04-29 17:43:20 INFO  CacheTester:42 - -2023288896
2015-04-29 17:43:20 INFO  CacheTester:42 - -1892732019
2015-04-29 17:43:20 INFO  CacheTester:42 - 1464306601
2015-04-29 17:43:20 INFO  CacheTester:42 - 921799986
2015-04-29 17:43:20 INFO  CacheTester:42 - 1037804977
//...

- - 背景 - -

我想使用我自己的 keyGenrator 来实现 @Cacheable 注释(Spring 和 ehCache)。

public Object generate(Object target, Method method, Object... params) {
    int key = Objects.hashCode(method.getName(), params);
    log.info("key = " + key);
    return key;
}

在这种情况下,我发现缓存总是丢失。

那我必须改成这样:

public Object generate(Object target, Method method, Object... params) {
    int result = method.getName().hashCode() : 0;
    result = 31 * result + Objects.hashCode(params);
    return result;
}

谢谢


这是因为hashCode for int[]没有被覆盖。没有理由为什么有两个实例int[]应该有相同的hashCode,即使条目相同。

尝试这个:

System.out.println(new int[] {1, 2}.hashCode());
System.out.println(new int[] {1, 2}.hashCode());

您几乎肯定会看到两个不同的整数。

一个很好的使用方法Objects.hash与数组是通过Arrays.hashCode(array)而不是实际的数组。在你的情况下你可以这样做:

Objects.hash("getDemoCache", "1", Arrays.hashCode(new int[]{1, 2}))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Objects.hash() 对于相同的输入返回不同的值? 的相关文章

随机推荐

  • 将 Application Insight 添加到现有的 Azure Service Fabric 群集

    自过去 4 个月以来 我们一直在开发 Azure Service Fabric 但现在决定拥有一个统一的日志基础设施 我们正在使用 AppInsight 我们如何将 AppInsight 密钥添加到现有的 Service Fabric 集群
  • 启用:仅关注键盘使用(或按 Tab 键)

    我想禁用 focus当不需要它时 因为我不喜欢焦点位于导航上时的外观 它使用相同的风格 active这很令人困惑 但是我不想为使用键盘的人摆脱它 我正在考虑添加一个类enabled focus在主体上按下标签 然后有body enabled
  • qsort 函数比较让我困惑

    我看到很多人在 qsort 比较器函数中使用减法 我认为这是错误的 因为在处理这些数字时 int nums 2147483648 1 2 3 INT MIN 2147483648 int compare const void a const
  • 使用 HTTPS 的 WCF 会话

    我无法弄清楚如何在使用 HTTPS 时为我的 WCF 服务启用每会话实例 我不是 ASP NET 专家 但如果可能的话 不想使用 ASP NET 会话状态 我正在使用 NET Framework 3 0 我遇到了以下矛盾 希望有人能告诉我哪
  • 每次表单输入字段更改时如何发送 ajax 请求?

    例如 有一个输入字段 每次用户在该字段中键入一个键时 它都会发送一个 AJAX 请求 其中包含当前输入中的任何文本 并对其执行某些操作 我研究了 Jquery 中的更改和 keyup 函数 但是当我在 Jsfiddle 中尝试它们时 它们没
  • 如何使用 jQuery.Ajax 访问 400 错误的 JSON 响应?

    在 jQuery 中 我将表单提交到服务器 当出现验证错误时 我会从服务器收到 400 错误 并且文档正文是有效的 JSON 我想知道如何访问从服务器返回的数据 我的 jQuery Ajax 对象上的 error 回调函数从未被调用 因此我
  • 使用 Android 应用程序更改网络运营商

    我正在尝试开发一个Android应用程序 它可以在地图上显示各个网络运营商的信号强度 问题是改变网络运营商的唯一方法是手动操作 关于如何在不手动更改的情况下获取此信息的任何想法 我认为有内部 私有 Android 类可以做到这一点 您将需要
  • Laravel 中的多线程

    我遇到了一个问题 我的数据库调用显着减慢了页面加载速度 我正在从选举数据填充多个图表 我的表包含大约 100 万行 我必须在每个方法中多次查询这些数据getCharts method I am 使用这个将返回数据传递给 JavaScript
  • Log4J2 AppenderLoggingException NoSuchMethodError StackLocatorUtil.getCurrentStackTrace()

    一旦发生异常 错误并且应该被记录 我就会收到以下错误 堆栈跟踪 org apache logging log4j core appender AppenderLoggingException java lang NoSuchMethodEr
  • iPhone 应用程序中的密码加密

    我需要将用户的密码存储在我的 iPhone 应用程序中 当将应用程序发布到应用程序商店时 我必须告诉Apple该应用程序中是否有出于导出目的的加密 我不希望我的应用程序仅限于美国 但我也不希望以明文形式通过网络存储或发送密码 所以基本上问题
  • v6 中可选参数的替代方法

    在 v5 中 我们可以添加尾随 路由可选参数 但与 v6 一样 对相同参数的支持已被删除 那么编写以下代码的替代方法是什么
  • 如何使用Log4Net实现日志文件自动归档

    我想以这样的方式配置 log4net 以便自动归档前一天的所有日志 是否有可能在 Log4Net 中自动存档以前的日志 我只想使用配置来执行此操作 而不使用任何第三方库 如 Sharplibzip 编写任何代码来创建存档 通过归档还要添加一
  • C# 正确格式化(缩进、对齐)C#

    我们有一个代码生成器munges给定数据库的模式 用于自动化我们内部的 n 层架构 输出是各种 C 部分类 每个文件一个 在处理所有字符串的代码中 我们尝试尽可能地控制缩进和格式 但当您在 Visual Studio 中打开文件时 格式总是
  • 逐行读取文件并分割值

    我需要读取一个txt文件 其组成如下 AA 1000 AA 320009 999999 AA 1011 AA 320303 111111 对于每个读取的行 我需要用 将其分割以到达第一回合 test 0 AA 1000 AA 320009
  • 调用 savechanges 时实体框架复制

    我首先使用entityframework 5代码 我有一个这样的模型 class Product public Product Fabrics new BindingList
  • 如何在Spring 3.0应用程序中配置Hibernate统计信息?

    我们如何配置以便在基于 Spring MVC 的 Web 应用程序中通过 JMX 获取 Hibernate 统计信息 有没有更好的方法来跟踪 Hibernate 性能 Set hibernate generate statistics to
  • Cakephp 2.0 使用电子邮件而不是用户名进行身份验证

    在我看来我有 在我的应用程序控制器中 public components array
  • ZF2中同一模块下的多个命名空间

    我在同一模块下配置多个命名空间 类时遇到问题 例如 我有一个名为 Account 的模块 其中我想包含所有与帐户相关的类 公司 accounts 用户 users 外部 api api 等 模块结构看起来像这样 Account Module
  • Base64 图像不显示在 RDLC 报告的渲染 PDF 上

    我正在尝试使用参数 CustomerSign 在 RDLC 报告中 我正在从报告中渲染 PDF 文件 并且看到 PDF 文件 我已配置图像属性如下 选择图像源 Database 使用该字段 Convert FromBase64String
  • 为什么 Objects.hash() 对于相同的输入返回不同的值?

    我运行了以下脚本 java 它给了我奇怪的结果 有谁可以帮忙解释一下吗 import java util Objects import org apache log4j Logger public class CacheTester pri