如下为将String获取hashcode,转为Long的方法,主要是在海量数据的flink程序里,为了节省状态的存储空间,所以尝试用long来存储。
同样的还可以hash其他格式的数据。
评估了下,murmur3最高用的是128位的hash值,加上hash碰撞算法,基本千万级以内的数据是不会冲突的。可是我们的场景是亿级,还是有一定的可能性,但是flink并行度设置为32的话,分到32个机器上的话,概率又会低一些,所以综合下来hash冲突的概率极低。具体是否会冲突,还需要程序跑出来和原String的状态产出的数据做对比。
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.google.common.base.Charsets;public class Murmur3Example {public static void main(String[] args) {// 创建Murmur3哈希函数HashFunction murmur3 = Hashing.murmur3_32();
// HashFunction murmur3 = Hashing.murmur3_128();// 要计算哈希码的字符串String input = "Hello, Murmur3!";// 使用Murmur3计算哈希码int hashCode = murmur3.hashString(input).asInt();// 另一种方法Long hashCode1 = murmur3.hashString(input, Charsets.UTF_8).asLong();// 打印结果System.out.println("Input: " + input);System.out.println("Murmur3 Hash Code: " + hashCode);System.out.println("Murmur3 Hash Code: " + hashCode1);}
}