一.背景介绍
MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。官方只提供了C语言的实现版本。
Java界中Redis,Memcached,Cassandra,HBase,Lucene都用它。
在Java的实现,Guava的Hashing类里有,上面提到的Jedis,Cassandra里都有Util类。
但存在的问题是由于Java的数据类型long与C语言中无符号长整型uint64_t有区别,导致Java输出版本存在负数,针对这个问题进行了修改;另外需要注意的是中文不同编码(UTF-8或GBK)会导致输出结果的不同,使用中需要统一编码。
一.实现类
import java.math.BigDecimal; import java.nio.ByteBuffer; import java.nio.ByteOrder; /** * 一致性Hash的一种算法 高效低碰撞率 */ public class Murmurs { /** * murmur hash算法实现 */ public static Long hash(byte[] key) { ByteBuffer buf = ByteBuffer.wrap(key); int seed = 0x1234ABCD; ByteOrder byteOrder = buf.order(); buf.order(ByteOrder.LITTLE_ENDIAN); long m = 0xc6a4a7935bd1e995L; int r = 47; long h = seed ^ (buf.remaining() * m); long k; while (buf.remaining() >= 8) { k = buf.getLong(); k *= m; k ^= k >>> r; k *= m; h ^= k; h *= m; } if (buf.remaining() > 0) { ByteBuffer finish = ByteBuffer.allocate(8).order( ByteOrder.LITTLE_ENDIAN); // for big-endian version, do this first: // finish.position(8-buf.remaining()); finish.put(buf).rewind(); h ^= finish.getLong(); h *= m; } h ^= h >>> r; h *= m; h ^= h >>> r; buf.order(byteOrder); return h; } public static Long hash(String key) { return hash(key.getBytes()); } /** * Long转换成无符号长整型(C中数据类型) */ public static BigDecimal readUnsignedLong(long value) { if (value >= 0) return new BigDecimal(value); long lowValue = value & 0x7fffffffffffffffL; return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1)); } /** * 返回无符号murmur hash值 */ public static BigDecimal hashUnsigned(String key) { return readUnsignedLong(hash(key)); } public static BigDecimal hashUnsigned(byte[] key) { return readUnsignedLong(hash(key)); } }
二.测试类
import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; public class MurmurHashTest { private static final Logger logger = LoggerFactory.getLogger(MurmurHashTest.class); @Test public void test() throws IOException { assertThat(Murmurs.hashUnsigned("chenshuo").toString()).isEqualTo("5016608279269930526"); assertThat(Murmurs.hashUnsigned("shaoguoqing").toString()).isEqualTo("17121371936686143062"); assertThat(Murmurs.hashUnsigned("baozenghui").toString()).isEqualTo("5451996895512824982"); assertThat(Murmurs.hashUnsigned("05ff62ff6f7749ffff43ffff6673ff65").toString()).isEqualTo("10652549470333968609"); assertThat(Murmurs.hashUnsigned("hahahaha").toString()).isEqualTo("15134676900169534748"); assertThat(Murmurs.hashUnsigned("hahah1369531321aha5466sfdfaerttedddd56da").toString()).isEqualTo("6439159232526071817"); assertThat(Murmurs.hashUnsigned("测试汉字").toString()).isEqualTo("1146745369200541601"); assertThat(Murmurs.hashUnsigned("1234566大大21".getBytes("GBK")).toString()).isEqualTo("10129762727109086067"); assertThat(Murmurs.hashUnsigned("12345665哦4哦3我的妈呀21".getBytes("GBK")).toString()).isEqualTo("5141842319936259217"); } }
相关推荐
MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...
这是MurmurHash算法,由c++改成c#版本。使用它在生500万内生成64位的数字,也是会出现碰撞的。在实际开发转,可能需要将不定长的数符中转生数字,想转生64位唯一数字的话。可以用md5算法生成16位的字节,再用Murmur...
murmurhash-js, MurmurHash算法的优化JavaScript实现 MurmurHash.jsMurmurHash算法的优化JavaScript实现。这些算法采用一个JavaScript字符串( 还有种子),并快速创建一个非加密的32位 散列。 我的意思是亚毫秒性能。...
murmurhash-java 这是Viliam Holub对快速非加密murmurhash2算法的一种实现。 它用Java编写,并以32位和64位版本实现。 如果您想了解最新的杂音世界,请查看Guava的类,该类具有murmur3和32位的实现。建造用maven构建...
一致性 hash 算法介绍
murmurHash3.js, 在javascript中,所有 MurmurHash3, MurmurHash3.jsMurmurHash3 算法的javascript实现。 用法// Return a 32bit hash as a unsigned int:> murmurHash3.x86.h
MurMurHash3 MurMurHash3算法的纯C#实现。
IT面试常见的题目,对于分布式存储系统中常碰到的故障问题,如何解决,就是采用一致性hash算法
Ketama算法是一致性hash算法的一个优秀实现。增删节点后数据命中率及均分率都很高。
采用java实现的常用hash算法归总。
一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)
别人写的一个一致性hash的java实现,分享下
ConsistentHash 一致性hash算法的 java 和 C++ 实现
一致性hash算法
var murmurHash3 = require('murmur-hash').v3; 例子 // Return a 32bit hash as a unsigned int: > murmurHash3.x86.hash32("I will not buy this record, it is scratched.") 2832214938 // Return a 128bit ...
一致性Hash算法的原理及实现
如果没有找到,则取整个环的第个节点。测试结果测试代码是整理的,主体法没有变分布平均性测试:测试随机成的众多key是否会平均分布到各个结点上测试结果如下:最上是参
简单模拟实现一致性Hash,透过虚拟节点映射至实际结点,解决一致性Hash的单调性和平衡性问题。
MurmurHash算法的优化JavaScript实现。 这些算法采用JavaScript字符串(和种子),并从中快速创建非加密的32位哈希。 快速,我指的是亚毫秒级的性能。 有关这些算法的更多信息,请参见: 安装 在浏览器中安装它:...
一致性哈希算法,广泛应用于分布式计算,C版实现,属于分布式服务器管理的核心算法。