当前位置: 首页 > 面试题库 >

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

翁文康
2023-03-14
问题内容

我运行了跟随脚本(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;
}

谢谢


问题答案:

这是因为hashCodefor 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}))


 类似资料:
  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y

  • 我正在使用Microsoft Graph Users API根据我们的ActiveDirectory验证用户名或电子邮件地址列表。名称搜索: https://graph.microsoft.com/v1.0/me/people/?$search=John.Smith 返回其他数据,如和。但如果我使用电子邮件搜索: null 我是否需要额外的权限来获取相同的数据? 更新:我按照下面的建议在https

  • 简单说明:PHP实现获得正确的user_id,react.js实现获得不正确的user_id。为什么!? 我在React下用PHP和Javascript实现了Instagram基本显示API OAuth流。 PHP下的流程工作得很好--我得到一个代码,我它使用curl来,我收到一个和一个,所有这些都很好,后续的图形API请求工作得很好。 然后我用JavaScript重新构建了它。在这里,当我获得一

  • 我正在使用带有Spring Security的BCryptPasswordEncoder。我的期望是,对于相同的输入,我总是得到相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用下面的代码片段对其进行测试: 输出:$2A$10$CYLM.QOXPEAZCZHJ3OXRLU9SLKB61LHYWW5QJ4QKVHEMHAXZ5QCPI 输出2:$2A$10$kevyx9yjj0f1x3wl

  • 问题内容: 问题 我有用于生成哈希的node.js模块。 最近,我注意到模块生成的哈希在新版本中有所不同: 码 Node.js v0.10.0 输出: Node.js v6.1.0 输出: 题 我想知道是什么导致了新版本中的问题,如何解决呢? 更新资料 GitHub上的类似问题: https://github.com/nodejs/node/issues/6813 https://github.c

  • } 我得到了下面的结果。但是在这个结果中,高亮显示的行具有相同的列名,但是别名不同。为什么hibernate会得到相同的Cloumn? 冬眠:删除表,如果存在hibernate_sequence hibernate:删除表(如果存在)UserDetails Hibernate:如果存在,则删除表车辆Hibernate:创建表hibernate_sequence(next_val bigint)En