源码:
public class HashTest { private static TreeMap<Long, Node> vNodes; //虚拟节点集合 private static List<Node> rNodes; //真实节点集合 private static final int REAL_NODE_NUM = 5; //真实节点数 private static final int VIRTUAL_NODE_NUM = 100; //虚拟节点数 public static void main(String[] args) { //物理节点 rNodes = new ArrayList<Node>(); for(int i=0; i<REAL_NODE_NUM; i++){ Node node = new Node("192.168.1." + (i+1), (1000+i), ""); rNodes.add(node); } init(); //生成随机数,验证测试数据在真实机器上的数量分布情况 Map<String, Long> map = new HashMap<String, Long>(); for(int i=0; i<1000; i++){ Node node = getNode("key"+i); if(map.containsKey(node.getIp())){ map.put(node.getIp(), new Long(map.get(node.getIp()).longValue() + 1)); }else{ map.put(node.getIp(), new Long(1)); } } //显示数据分布情况 for(Iterator<String> it = map.keySet().iterator(); it.hasNext();){ String ip = it.next(); System.out.println(ip + ": " + map.get(ip)); } } /** * 初始化真实节点和虚拟节点之间的映射关系 */ private static void init() { vNodes = new TreeMap<Long, Node>(); for(int i=0; i<rNodes.size(); i++){ final Node node = rNodes.get(i); for(int j=0; j<VIRTUAL_NODE_NUM; j++){ String hashKey = node.getIp() + "-V-" + j; node.setHashKey(hashKey); vNodes.put(hash(hashKey), node); } } } /** * 获取对应的真实节点对象 * @param key * @return */ public static Node getNode(String key) { Node node = null; SortedMap<Long, Node> tail = vNodes.tailMap(hash(key)); if(tail.size() == 0){ node = vNodes.get(vNodes.firstKey()); }else{ node = tail.get(tail.firstKey()); } node.setData(key); return node; } /** * 一致性hash算法 * @param key * @return */ private static Long hash(String key) { ByteBuffer buf = ByteBuffer.wrap(key.getBytes()); 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; } }
相关推荐
1. 一致性(Consistency):相同的输入会产生相同的哈希值。 2. 压缩性(Compression):无论输入多大,哈希函数都能将其压缩成固定长度的输出。 3. 有损性(Lossiness):仅凭哈希值无法恢复原始输入。 四、密码学...
这个过程通常称为“哈希”或“消息摘要”,它能够有效地验证数据的完整性和一致性。EVP(Encryption and Verification Provider)是OpenSSL库中的一个组件,提供了包括哈希在内的多种加密和验证功能。在这个"evp_md....
一致性哈希是一种分布式哈希算法,它解决了在分布式系统中动态加入或移除节点时,数据分布尽可能均匀的问题,从而避免了大规模的数据迁移。Go-AnchorHash是专门为Go语言设计的一种内存效率极高的 AnchorHash 实现,...
这篇文档主要探讨了在拉勾训练营学到的分布式问题解决方案,特别是涉及一致性哈希算法及其应用。 1. **一致性哈希算法**: 一致性哈希算法是一种解决分布式系统中负载均衡和数据分布问题的方法。它旨在减少在添加...
一致性哈希是一种分布式哈希算法,常用于负载均衡系统中,特别是在分布式缓存和微服务架构中,以确保在节点增减时尽量少地改变已有的哈希分布。 **标签解析:** "nginx" 表明这个话题与 Nginx 服务器软件有关,而 ...
一致性哈希是一种以提供或删除一个插槽不会显着改变键到插槽的映射的方式提供哈希表功能的方案。 可以在博客文章中阅读有关hash_ring的更多信息(该文章更详细地解释了该想法): 一致的散列仅在python中实现 这些...
一致性哈希的主要目标也是在服务器数量变化时尽可能减少数据迁移,它通过使用虚拟节点的概念来进一步优化数据分布。在Rendezvous Hashing的例子中,若服务器S4停止服务,其数据将全部转移到S3,可能导致S3过载。为了...
以上内容详细阐述了缓存技术中的Redis客户端并发控制、哈希表实现、一致性哈希算法、LRU策略、slab分配以及缓存系统的热点问题与解决方法,以及Memcached和Redis的基本特性比较。这些知识点对于理解和使用分布式缓存...
跳转一致性哈希算法的实现: : 例子 package main import ( "fmt" "github.com/lazybeaver/jmpconsistenthash" ) func main() { var key uint64 = 0xdeadbeef var shards uint64 = 5 hash := ...
在Java中,你可以通过扩展`MessageDigest`类或者使用特定库来实现SM3哈希计算,以确保数据的完整性和一致性。 3. **SM4算法**:SM4是一种分组密码算法,主要用于块加密。它采用了128位的密钥和128位的数据块。在...
为了解决这种情况,一致性哈希引入了“虚拟节点”(vnode,也称为 partition)的概念:“虚拟节点”是实际节点在环形空间的复制,Swift 使用该算法来解决数据存储的问题。 因此,Swift 是一种高可用性、可扩展性和...
哈希算法,如MD5(Message-Digest Algorithm 5)和SHA(Secure Hash Algorithm),用于生成数据的固定长度摘要,通常用于验证数据的完整性和一致性。哈希函数是单向的,即不能从哈希值恢复原始数据,因此它们对于...
8. **哈希算法**:用于快速查找和存储,通过哈希函数将数据映射到固定大小的哈希表中。哈希冲突的处理是关键,常见的方法有开放寻址法和链地址法。 9. **求最短路径问题**:Dijkstra算法、Floyd-Warshall算法等用于...
jch-rs-为Rust跳转一致的哈希值 跳转一致性哈希是一种线性复杂性算法,在例子use jch;let key = 5u64 ;let num_buckets = 1024i32 ;println! ( "{}" , jch :: hash (key, num_buckets));
同时,也会使用更安全的哈希算法,如SHA-256,来增强签名的不可伪造性。 接口验签的过程与签名类似,服务端收到请求后,会重新按照同样的步骤生成签名,然后与请求中携带的签名进行对比,如果一致,则认为请求合法...
这个过程是不可逆的,即无法通过摘要恢复原始数据,因此MD5通常用于验证数据的完整性和一致性。然而,由于其碰撞概率较高(即不同的输入可能产生相同的输出),MD5已不再适合用于安全敏感的应用,如密码存储。 在C#...
MD5的主要用途是校验数据的完整性和一致性,比如在软件分发、文件传输等领域,通过比较MD5值来确认文件是否被篡改。 在Delphi编程环境中,实现MD5算法通常涉及到以下几个关键步骤: 1. **引入库**:在Delphi中,MD...
同样,如果S值较大,也不能排除两个程序的算法实质上是一致的,只是关键字选择不同。例如,`while`循环和`for`循环在功能上是可以互换的,但它们在哈希向量中对应的位置会有差异。 最后,通过编写多个具有不同相似...