为什么相同输入的 Objects.hash() returns 不同值?
Why Objects.hash() returns different values for the same input?
我运行跟随脚本(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;
}
谢谢
这是因为 int[]
的 hashCode
没有被覆盖。 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}))
我运行跟随脚本(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;
}
谢谢
这是因为 int[]
的 hashCode
没有被覆盖。 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}))