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类类getClassLoader()方法及示例

    Java类类getClassLoader()方法及示例类的类getClassLoader()方法(ClassclassgetClassLoader()method)getClassLoader()methodisavailableinjava.langpackage.getClassLoader()方法在java.lang包中可用。getClassLoader()methodisusedtoreturnthe…

    2022年5月15日
    30
  • 发现C++Builder 2010一组类BUG

    发现C++Builder 2010一组类BUG

    2022年1月16日
    42
  • rgbd slam v2_rgb数据格式

    rgbd slam v2_rgb数据格式系统版本:Ubuntu16.04+ROS-Kinect1、安装运行首先rgbdslamv2是2014年开源出来的一个机遇RGBD相机构建点云地图的框架【1】,作者已经在github上开源出了代码【2】,并且给出了一个一键安装的脚本(install.sh)。但是我们会发现,我们直接运行这个install脚本会在~/Code目录下创建一个rgbdslam_catkin_ws工作空间,…

    2022年9月15日
    2
  • 知识图谱—知识推理综述(三)

    知识图谱—知识推理综述(三)知识图谱—知识推理综述(三)接上一篇文章知识图谱—知识推理综述(二)3基于表示的知识推理3.1方法简述在之前所介绍的知识推理中,都显示的定义了知识推理所需要的规则,条件等等离散符号。而在基于表示的知识推理中,我们第一步是将知识图谱中的节点和关系进行连续向量空间的映射,需要将其物理表示映射为数值表示,然后在利用数学中的相关算法,通过数值计算的方式进行知识推理。对于映射的向量空间而言,其可以是一个或者多个的向量或者矩阵。基于表示的推理的核心在于“如何表示”,在表示学习的过程中,我们需要的是让算法自

    2022年5月12日
    41
  • c++ 动态链接库 资源文件_wsastartup函数头文件

    c++ 动态链接库 资源文件_wsastartup函数头文件原创文章,转载请注明出处。C++Lib和Dll的加载加载Dll1>通过LoadLibary加载,GetProcAddress调用加载Dll1>通过LoadLibary加载,GetProcAddress调用如果加载失败,通过GetLastError()获取失败原因。下面是LoadLibary的示例代码第一步,在.h中声明了staticHMODULEhDLL;#include<Windows.h>//加载的头文件classQIDCardReader:.

    2022年9月30日
    2
  • 关于RuntimeException[通俗易懂]

    关于RuntimeException[通俗易懂]关于RuntimeException今天在写一个异常类的时候继承了RuntimeException,想一探究竟。RuntimeException:在定义方法时不需要声明会抛出runtimeException。Exception:定义方法时必须声明所有可能会抛出的exception。于是去查看了一翻api。publicRuntimeException() 提出了一种新的null运行时异常的详细信息。原因是没有初始化,初始化后可通过调用Throwable.initCause(..

    2022年7月24日
    23

发表回复

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

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