揭阳网站建设antnw,医院 网站建设 新闻,西安网站优化招聘网,企业网站维护服务MurmurHash#xff1a;(multiply and rotate) and (multiply and rotate) Hash#xff0c;乘法和旋转的hash 算法。
一、哈希函数
散列函数#xff08;英语#xff1a;Hash function#xff09;又称散列算法、哈希函数#xff0c;是一种从任何一种数据中创建小的数字“…MurmurHash(multiply and rotate) and (multiply and rotate) Hash乘法和旋转的hash 算法。
一、哈希函数
散列函数英语Hash function又称散列算法、哈希函数是一种从任何一种数据中创建小的数字“指纹”的方法。
散列函数把消息或数据压缩成摘要使得数据量变小将数据的格式固定下来。
该函数将数据打乱混合重新创建一个叫做散列值hash valueshash codes的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。
特点
加密加密存在数据库中的密码password字符串由于散列算法所计算出来的散列值Hash Value具有不可逆无法逆向演算回原本的数值的性质因此可有效的保护密码。
压缩把任意长度的输入通过散列算法变换成固定长度的输出。
场景
保护资料、确保传递真实的信息、散列表、错误校正、语音识别、信息安全...
常见哈希算法
MD系列(MD5)、SHA系列(SHA-1)、CRC甚至JDK hashCode()也是哈希算法的一种。可以将他们分成三代
第一代SHA-11993MD51992CRC1975Lookup32006
第二代MurmurHash2008
第三代CityHash SpookyHash2011
分类可分为加密型、非加密型
加密型MD系列(MD5)、SHA系列(SHA-1)
非加密型CRC、MurmurHash 二、MurmurHash
MurmurHash 是一种非加密型哈希函数适用于一般的哈希检索操作。由Austin Appleby在2008年发明并出现了多个变种都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比对于规律性较强的keyMurmurHash的随机分布特征表现更良好。
特点
1.快 MurMurHash3 比 MD5 快
2.低碰撞MurMurHash3 128 位版本哈希值是 128 位的跟 MD5 一样。128 位的哈希值在数据量只有千万级别的情况下基本不用担心碰撞。
3.高混淆散列值比较“均匀”如果用于哈希表布隆过滤器等, 元素就会均匀分布。
广泛应用于各开源产品Java 界中 RedisMemcachedCassandraHadoopHBaseLucenesparknginx常见的大数据库底层都使用了这个算法作为底层的存储算法。
MurMurHash3 128 位版本的速度是 MD5 的十倍。有趣的是MurMurHash3 生成 32 位哈希的用时比生成 128 位哈希的用时要长。原因在于MurMurHash3_128 针对现代 x64 平台cpu进行了优化。 三、MurmurHash的使用
Java版google guava 包中提供了使用工具类
groupIdcom.google.guava/groupIdartifactIdguava/artifactId
version30.1.1-jre/version
package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** author joker* version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static void main(String[] args) {String base64 CSHyrMyg087o3JWW7EWnllHweWg1OVpxupHegjYREjousvZYdaWMCDWk1nEvDEFpzdsxSBunEPdUlgdu4lCspuK32t68ruwKCU4KOM8ZIGXjjp10/lMrymjdYYLaIiAhdAHeOfGzRfYUlJXGn4iV0tahHCGeh9//Ap6Mv6nhxxrbxWwYDnYC6PRvdoMpwaVydfGfValGkygZnnr84uAzPytXqGzF23M6gNWtFT29yTMdK3vZaUtkE3AaybRO0DLBkBnqeWXnBNqFQHWnHg;String hash128String getHexHash128String(base64);System.out.println(hash128String);}public static String getHexHash128String(String str) {HashFunction hashFunction Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}
}性能测试
package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** author joker* version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static void main(String[] args) {String base64 CSHyrMyg087o3JWW7EWnllHweWg1OVpxupHegjYREjousvZYdaWMCDWk1nEvDEFpzdsxSBunEPdUlgdu4lCspuK32t68ruwKCU4KOM8ZIGXjjp10/lMrymjdYYLaIiAhdAHeOfGzRfYUlJXGn4iV0tahHCGeh9//Ap6Mv6nhxxrbxWwYDnYC6PRvdoMpwaVydfGfValGkygZnnr84uAzPytXqGzF23M6gNWtFT29yTMdK3vZaUtkE3AaybRO0DLBkBnqeWXnBNqFQHWnHg;String hash128String getHexHash128String(base64);System.out.println(hash128String);long l System.nanoTime();int num 10000000;for (int i 0; i num; i) {String hexHashString1 getHexHash128String(base64);}long time System.nanoTime() - l;System.out.println(num条数据一共花费时间 time / (1000 * 1000 * 1000) 秒);long ns time / (num);System.out.println(num条数据每条数据花费时间 ns 纳秒);}public static String getHexHash128String(String str) {HashFunction hashFunction Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}
}
32位与128位
MurmurHash 算法提供了两种长度的哈希值一种是 32bits一种是 128bits。为了让最终生成的短网址尽可能短可以选择 32bits 的哈希值。
package com.joker.cloud.linserver.conf.murmur;import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;import java.nio.charset.StandardCharsets;/*** MurmurHashTest** author joker* version 1.0* 2023/3/7 14:29**/public class MurmurHashTest {public static String getHexHash32String(String str) {HashFunction hashFunction Hashing.murmur3_32();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}public static String getHexHash128String(String str) {HashFunction hashFunction Hashing.murmur3_128();return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();}public static Long getHexHash32Long(String str) {HashFunction hashFunction Hashing.murmur3_32();return hashFunction.hashString(str, StandardCharsets.UTF_8).padToLong();}}
常用于长链接转短链接
实现思路是通过哈希算法生成短网址。采用计算速度快、冲突概率小的 MurmurHash 算法并将计算得到的 10 进制数转化成 62 进制表示法进一步缩短短网址的长度。对于哈希算法的哈希冲突问题通过给原始网址添加特殊前缀字符重新计算哈希值的方法来解决。
长链接转短链接-CSDN博客