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虚拟机(JVM)?

    究竟什么是Java虚拟机(JVM)?我们都知道,在Windows上,软件包后缀有exe,而苹果的MacOSX系统上没有安装exe。类似地,MacOSX系统上的软件安装包是dmg后缀,不能安装在Windows系统上。为什么不能安装不同系统上的软件,因为操作系统的底层实现是不同的。对于Windows系统,exe后缀的软件代码被编译成能被Windows系统识别的机器代码。对于MacOSX系统,最后将DMG后缀的软件代码编译为M…

    2022年7月8日
  • Java判断对象是否为空的方法:isEmpty,null,” “

    Java判断对象是否为空的方法:isEmpty,null,” “今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。查了一下关于判断为空的几个方法的区别,这里做一个简单的总结:null一个对象如果有可能是null的话,首先要做的就是判断是否为null:object==null,否则就有可能会出现空指针异常,这个通常是我们在进行数据库的查询操作时,查询结果首…

    2022年6月13日
  • 手机端有没有好用的图片识别文字工具值得推荐?

    手机端有没有好用的图片识别文字工具值得推荐?图片转文字,用到的就是OCR识别技术,针对网络上复杂字体实现精确识别功能,经常用于社交、电商、学习等场景。传统的将图片识别文字的方式选择手动书写,随着AI智能技术的应用,以OCR智能识别工具由于使用简单、转写效率高逐渐代替传统的手动书写。下面给大家分享三款超好用的图片转文字工具,看看你喜欢的有没有上榜。1、微信提取文字微信基本上是现在手机中必装软件,很多人仅用微信用来日常聊天,实际上很多小功能也是非常好用。今天给大家介绍微信提取文字的方法。第一步:打开好友对话框,找到需要识别的图片。第二步:点击右下

    2022年5月3日
  • 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    2021年12月6日
  • 通过工具SecureCRTPortable将项目部署到服务器上

    通过工具SecureCRTPortable将项目部署到服务器上1.将项目打包2.打开工具连接指定的ip下面是一些命令  tab键可以有一些提示功能  ls查看服务器当前目录  lls查看硬盘当前目录  其实就是linux系统命令,服务器是正常命令,操作本电脑的就在前面加个l  例如lslls,cdlcd…

    2022年5月11日
  • 数据挖掘与数据分析[通俗易懂]

    数据挖掘与数据分析[通俗易懂]一、数据挖掘和数据分析概述数据挖掘和数据分析都是从数据中提取一些有价值的信息,二者有很多联系,但是二者的侧重点和实现手法有所区分。数据挖掘和数据分析的不同之处:1、在应用工具上,数据挖掘一般要通过自己的编程来实现需要掌握编程语言;而数据分析更多的是借助现有的分析工具进行。2、在行业知识方面,数据分析要求对所从事的行业有比较深的了解和理解,并且能够将数据与自身的业务紧密结合起来;而数…

    2022年6月5日

发表回复

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

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