hashCode的function只保证在同一个execution里面,同一个object的hash code是相同的。对于基础类型,包括map之类的,java能保证同样的内容能即使不是同一个obj,也可以得到相同的hashcode。但是对于自定义的结构体,同样的内容并不能得到同样的hashcode。
回想起了之前同事以及自己干过的蠢事。用一个obj的hashcode来直接判cache或者做A/Btest 分流。。。
看一些文章+讨论。
https://martin.kleppmann.com/2012/06/18/java-hashcode-unsafe-for-distributed-systems.html
https://news.ycombinator.com/item?id=4127664
public class EqualityIndex {
private int index;
public EqualityIndex(int initialIndex) {
this.index = initialIndex;
}
public static void main(String[] args) {
for (int i = 0; i < 3; ++i) {
EqualityIndex ei = new EqualityIndex(2);
System.out.println(ei.hashCode());
}
for (int i = 0; i < 3; ++i) {
String str = new String("hah");
System.out.println(str.hashCode());
}
for (int i = 0; i < 3; ++i) {
Map<String, String> map = new HashMap<>();
map.put("a", "b");
System.out.println(map.hashCode());
}
for (int i = 0; i < 3; ++i) {
List<String> list = new ArrayList<>();
list.add("aaaaa");
System.out.println(list.hashCode());
}
}
}
output:
1673605040
186276003
1681433494
103055
103055
103055
3
3
3
92567616
92567616
92567616
网友评论