hash函数MurmurHash「建议收藏」

hash函数MurmurHash「建议收藏」介绍原理优点使用场景1、根据uuid,通过hash算法进行取模分库分表2、

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、介绍

MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。

Java界中Redis,Memcached,Cassandra,HBase,Lucene都用它。

在Java的实现,Guava的Hashing类里有,上面提到的Jedis,Cassandra里都有Util类。

但存在的问题是由于Java的数据类型long与C语言中无符号长整型uint64_t有区别,导致Java输出版本存在负数,针对这个问题进行了修改;另外需要注意的是中文不同编码(UTF-8或GBK)会导致输出结果的不同,使用中需要统一编码。

 

二、原理

hash函数MurmurHash「建议收藏」

算法图例

hash函数MurmurHash「建议收藏」

 

三、性能测试对比

import java.nio.charset.StandardCharsets;
import org.apache.commons.codec.digest.DigestUtils;
import com.google.common.hash.Hashing;

public class Test {

	public static void main(String[] args) {
		
		System.out.println(murmur3Test("334324324234234sfsfsdfwwrtregreg"));
		
		 long startTime=System.currentTimeMillis();
		 for (int i = 0; i < 10000000; i++) {
			 Test.md5Test("KFETHGRETWERFSDFWEFWEFWF");
	     }
	     long endTime=System.currentTimeMillis();
	     System.out.println("1000万次md5Test算法程序运行时间: " + (endTime - startTime ) + "ms");
	     
	     long startTime2=System.currentTimeMillis();
		 for (int i = 0; i < 10000000; i++) {
			 Test.murmur3Test("KFETHGRETWERFSDFWEFWEFWF");
	     }
	     long endTime2=System.currentTimeMillis();
	     System.out.println("1000万次murmur3Test算法程序运行时间: " + (endTime2 - startTime2 ) + "ms");
		
	}
	
	public static String murmur3Test(String primaryKey) {
        return Hashing.murmur3_32().hashString(primaryKey, StandardCharsets.UTF_8).toString() + 
            "_" + primaryKey;
    }
	
	public static String md5Test(String primaryKey) {
	        return DigestUtils.md5Hex(primaryKey)+ "_" + primaryKey;
	}

}

输出:

539aa3e7_334324324234234sfsfsdfwwrtregreg
1000万次md5算法程序运行时间: 4420ms
1000万次murmur3Test算法程序运行时间: 1902ms

结论:

MurmurHash算法比md5快一倍。

 

四、使用场景

1、根据uuid,通过hash算法进行取模分库分表

2、用来计算出key的slot值

3、短链接

 

五、其他算法

ketamahash一致性哈希算法

由若干固定的虚拟节点来计算出每个虚拟节点的slots,数据存储的时候,算出key的slot值,然后存入相邻最近的虚拟节点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180273.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案

    java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案首先 简单介绍一下 XSS 定义 一 XSS 介绍 XSS 是跨站脚本攻击 CrossSiteScr 的缩写 为了和层叠样式表 CSS CascadingSty 加以区分 因此将跨站脚本攻击缩写为 XSS XSS 是因为有些恶意攻击者往 Web 页面中插入恶意 Script 代码 当用户浏览该页面时 嵌入的 Script 代码将会被执行 从而达到恶意攻击用户的特殊目的 二 XSS 攻击目

    2025年7月28日
    2
  • Vue 关闭eslint 严格模式「建议收藏」

    Vue 关闭eslint 严格模式「建议收藏」找到.eslintrc.js文件

    2022年10月8日
    6
  • AD域服务器的搭建(1)–AD域介绍

    AD域服务器的搭建(1)–AD域介绍目录服务定义:目录服务就是按照树状存储信息的模式目录服务特点1.目录服务的数据类型主要是字符型,而不是关系数据库提供的整数、浮点数、日期、货币等类型2.为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES(大小写敏感)、TEL(电话型)等语法(Syntax)同样也不提供象关系数据库中普遍包含的大量的函数3.目录有很强的查询(读)功能,适合于进行大量数据的检索…

    2022年5月16日
    41
  • Pytorch 安装及使用(Pycharm 版)

    Pytorch 安装及使用(Pycharm 版)Pytorch安装(Pychram版)

    2022年8月26日
    11
  • Js保留两位小数_如何保留两位小数

    Js保留两位小数_如何保留两位小数一、“四舍五入”算法  1.四舍五入的情况varnum=4.2167456;num=num.toFixed(2);//输出结果为4.22varnum=4.2167456;num=Math.round(num*100)/100;//输出结果为4.22varnum=4.2007456;num=Math.round(num*…

    2022年8月10日
    5
  • 【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O[通俗易懂]

    【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O[通俗易懂]【导语】当下,物业管理行业正在接受新科技浪潮的冲击和洗礼,业界企业纷纷探索物业服务的新发展模式。云服务、微社区、微信公众平台、app等,这些本来陌生的词汇在物业管理行业变得耳熟能详。在借助科技手段拓展多种经营,提升竞争力、增加创富能力、开展信息化建设和管理的同时,部分物业服务企业的发展模式和理念又提升了一大步,现代科技推动物业管理行业发展正在成为现实。第一部分:移动互联网改变传统物业管…

    2022年6月22日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号