Java中的基本的类都有一个hashCode方法用来生成一个int值,我们称之为hashCode值,这个值是根据一定的规则(比如对象的存储地址,对象的字段等)生成的,这个值的作用是为了提高集合类的性能,例如HashSet、HashMap以及HashTable。我们可可以修改这个值的生成方式来自定义hashCode生成方法。
哈希值(同散列值)
把任意长度的输入通过哈希算法(散列算法)变换成固定长度的输出,该输出就是哈希值(散列值)。这种转换是一种压缩映射,所以散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
哈希算法(同散列算法)
用于生成哈希值的算法就是哈希算法,所有散列函数都有如下一个基本特性:
1. 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。
2.散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
以前从来都没有直接使用过这个值。一直没怎么了解,但是最近碰到一个大数据量的聚类问题。平台每天接收到上千万的数据量并将这些数据写入kafka,要求id值相同的数据写入同一个topic中。因为数据量很大所以不能存到缓存和数据库。必须想办法实时计算。并保证相同的值计算的结果一致。
最终参照hashCode值的生成方式来生成一个hashCode值。这样就不需要将id存储起来。每次只要用新的id计算hashCode值,再%10之后获取绝对值,就能获取到对应要写入的分区。又能保证同一个id生成的hashCode值相同。