Murmur3 Hash 128位java和C#方法

2,146 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

Hash(散列函数)

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

Murmur哈希

Murmur哈希是一种非加密散列函数,适用于一般的基于散列的查找。它在2008年由Austin Appleby创建,在Github上托管,名为“SMHasher” 的测试套件。 它也存在许多变种,所有这些变种都已经被公开。 该名称来自两个基本操作,乘法(MU)和旋转(R),在其内部循环中使用。 与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的。

Murmur哈希3

2018年的版本是Murmur哈希3,它产生一个32位或128位散列值。 使用128位时,x86和x64版本不会生成相同的值,因为算法针对各自的平台进行了优化。

java

首先在项目的pom.xml 文件中添加com.google.guava引入依赖

		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>20.0</version>
		</dependency>

然后使用Hashing.murmur3_128().newHasher() new一个hasher对象,将要哈希的字符串inputStr传入进去,设置char为utf-8,在调用下hash()最后转换成字符串,就可以生成128位的hash值。

      Hashing.murmur3_128().newHasher().putString(inputStr, StandardCharsets.UTF_8).hash().toString();

C#调用System.Data.HashFunction.MurmurHash

在nuget中添加System.Data.HashFunction.MurmurHash 的引用

调用System.Data.HashFunction.MurmurHash.MurmurHash3Factory.Instance.Create 创建hash对象,并传入hashConfig,hashConfig 设置128位,然后murmurHash3.ComputeHash() 传入要hash的字符串字节数组,最后调用AsHexString方法生成128位哈希字符串。不要用toString()

            var bytes = Encoding.UTF8.GetBytes(inputStr);
            var hashConfig = new System.Data.HashFunction.MurmurHash.MurmurHash3Config();
            hashConfig.Seed = 0;
            hashConfig.HashSizeInBits = 128;
            var murmurHash3 = System.Data.HashFunction.MurmurHash.MurmurHash3Factory.Instance.Create(hashConfig);
            var hashString = murmurHash3.ComputeHash(bytes).AsHexString();