?
如下为将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;
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);
}
}