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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 树莓派介绍以及FAQ【这是我见过最全的树莓派教程】

    树莓派介绍以及FAQ【这是我见过最全的树莓派教程】一、树莓派简介树莓派是什么?树莓派(RaspberryPi)是尺寸仅有信用卡大小的一个小型电脑,您可以将树莓派连接电视、显示器、键盘鼠标等设备使用。树莓派能替代日常桌面计算机的多种用途,包括文字处理、电子表格、媒体中心甚至是游戏。并且树莓派还可以播放高至4K的高清视频。我们希望将树莓派推广给全世界的青少年电脑爱好者,用于培养计算机程序设计的兴趣和能力。树莓派各版本发布时间和差异对照?二、购买与配送在哪里购买?(说人话京东和淘宝都可以直接购买)树莓派基金会与E络盟与…

    2022年10月14日
    0
  • 树莓派开发笔记(十):Qt读取ADC模拟量电压(ADS1115读取电压模拟量)

    树莓派开发笔记(十):Qt读取ADC模拟量电压(ADS1115读取电压模拟量)若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936本文章博客地址:https://blog.csdn.net/qq21497936/article/details/102524577目录前话Demo运行效果Demo:电压模拟量采集ADS1115实物特点引脚图与访问地址多个ADS1115连接(单级…

    2022年10月25日
    0
  • java官网下载「建议收藏」

    java官网下载「建议收藏」安装版http://javadl.oracle.com/webapps/download/AutoDL?BundleId=234471_96a7b8442fe848ef90c96a2fad6ed6d1win64http://javadl.oracle.com/webapps/download/AutoDL?BundleId=234474_96a7b8442fe848ef90c96a2f…

    2022年7月7日
    30
  • 推荐几款s60软件

    推荐几款s60软件用了一段时间E72(应该是E52),大概已经习惯了s60系统s60既不会出什么问题,也不会太出众,这份稳定,就是我所需要的介绍一下笔者常用的软件吧系统工具类360手机卫士虽然来电通也是很好的软件,但如

    2022年7月3日
    29
  • 掌上生活app下载安装_浏览器下载

    掌上生活app下载安装_浏览器下载环境要求HttpRunner是一个基于Python开发的测试框架,可以运行在macOS、Linux、Windows系统平台上。这里使用macOS系统进行演示对于python版本要求:py

    2022年7月29日
    3
  • 【源码分析】Kafka分区重分配/迁移(kafka-reassign-partitions.sh)

    【源码分析】Kafka分区重分配/迁移(kafka-reassign-partitions.sh)/***Thiscallbackisinvokedbythereassignedpartitionslistener.Whenanadmincommandinitiatesapartition*reassignment,itcreatesthe/admin/reassign_partitionspaththattriggersthezookeeperlistener.*Reassigningreplicasforapar

    2022年6月26日
    25

发表回复

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

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