哈希大杂烩

栏目: 数据库 · 发布时间: 7年前

内容简介:一致性哈希一般用来做分布式缓存将各服务器的哈希值映射到一个圆环上(一般用0~2^32-1),缓存寻址时,将缓存的键取哈希值放到圆环上,然后顺时针寻找第一个服务器节点,用找到的这个节点做缓存服务器有缓存服务器5台,缓存键30个,分别对每个缓存键在服务器上寻址

一致性哈希一般用来做分布式缓存

将各服务器的哈希值映射到一个圆环上(一般用0~2^32-1),缓存寻址时,将缓存的键取哈希值放到圆环上,然后顺时针寻找第一个服务器节点,用找到的这个节点做缓存服务器

Java 示例

有缓存服务器5台,缓存键30个,分别对每个缓存键在服务器上寻址

Java代码

package bj;

import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Test;

import java.nio.ByteBuffer;
import java.util.TreeSet;
import java.util.stream.IntStream;

/**
 * Created by BaiJiFeiLong@gmail.com at 2018/12/6 下午2:11
 */
public class LinearHashingTest {

    @RequiredArgsConstructor
    static class Node implements Comparable<Node> {
        private final String name;

        long digest() {
            byte[] digest = DigestUtils.md5(name);
            return Integer.toUnsignedLong(ByteBuffer.wrap(digest, 0, 4).getInt());
        }

        @Override
        public int compareTo(Node o) {
            return Long.compare(this.digest(), o.digest());
        }

        @Override
        public String toString() {
            return String.format("Node(name=%s, digest=%d)", name, digest());
        }
    }

    @Test
    public void testAlpha() {
        TreeSet<Node> set = new TreeSet<>();
        for (int i : new int[]{1, 2, 3, 4, 5}) {
            set.add(new Node("server" + i));
        }

        System.out.println("Server nodes:");
        for (Node node : set) {
            System.out.println(node);
        }

        System.out.println("Routing...");
        IntStream.rangeClosed(1, 20).forEach(i -> {
            long hash = new Node("key" + i).digest();
            System.out.printf("key%d\t%d\t => %s\n", i, hash, route(set, hash));
        });

        IntStream.rangeClosed(1, 20).forEach(i -> {
            set.add(new Node("key" + i));
        });
        System.out.println("All nodes:");
        for (Node node : set) {
            System.out.println(node);
        }
    }

    private Node route(TreeSet<Node> nodes, long code) {
        for (Node node : nodes) {
            if (node.digest() > code) {
                return node;
            }
        }
        return nodes.first();
    }
}
``

控制台输出:

```log
Node(name=server3, digest=232443701)
Node(name=server2, digest=424647047)
Node(name=server4, digest=648772546)
Node(name=server5, digest=1375127456)
Node(name=server1, digest=2822999463)
Routing...
key1	3266172564	 => Node(name=server3, digest=232443701)
key2	2029528490	 => Node(name=server1, digest=2822999463)
key3	909203333	 => Node(name=server5, digest=1375127456)
key4	3405308747	 => Node(name=server3, digest=232443701)
key5	1034591130	 => Node(name=server5, digest=1375127456)
key6	1684928417	 => Node(name=server1, digest=2822999463)
key7	4187051213	 => Node(name=server3, digest=232443701)
key8	1564577213	 => Node(name=server1, digest=2822999463)
key9	215402731	 => Node(name=server3, digest=232443701)
key10	4045919512	 => Node(name=server3, digest=232443701)
key11	3930184853	 => Node(name=server3, digest=232443701)
key12	3610429654	 => Node(name=server3, digest=232443701)
key13	4149020260	 => Node(name=server3, digest=232443701)
key14	2302410740	 => Node(name=server1, digest=2822999463)
key15	1605175883	 => Node(name=server1, digest=2822999463)
key16	4248449615	 => Node(name=server3, digest=232443701)
key17	3126975152	 => Node(name=server3, digest=232443701)
key18	533962436	 => Node(name=server4, digest=648772546)
key19	1425581655	 => Node(name=server1, digest=2822999463)
key20	180948674	 => Node(name=server3, digest=232443701)
All nodes:
Node(name=key20, digest=180948674)
Node(name=key9, digest=215402731)
Node(name=server3, digest=232443701)
Node(name=server2, digest=424647047)
Node(name=key18, digest=533962436)
Node(name=server4, digest=648772546)
Node(name=key3, digest=909203333)
Node(name=key5, digest=1034591130)
Node(name=server5, digest=1375127456)
Node(name=key19, digest=1425581655)
Node(name=key8, digest=1564577213)
Node(name=key15, digest=1605175883)
Node(name=key6, digest=1684928417)
Node(name=key2, digest=2029528490)
Node(name=key14, digest=2302410740)
Node(name=server1, digest=2822999463)
Node(name=key17, digest=3126975152)
Node(name=key1, digest=3266172564)
Node(name=key4, digest=3405308747)
Node(name=key12, digest=3610429654)
Node(name=key11, digest=3930184853)
Node(name=key10, digest=4045919512)
Node(name=key13, digest=4149020260)
Node(name=key7, digest=4187051213)
Node(name=key16, digest=4248449615)

文章首发: https://baijifeilong.github.io


以上所述就是小编给大家介绍的《哈希大杂烩》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Fluent Python

Fluent Python

Luciano Ramalho / O'Reilly Media / 2015-8-20 / USD 39.99

Learn how to write idiomatic, effective Python code by leveraging its best features. Python's simplicity quickly lets you become productive with it, but this often means you aren’t using everything th......一起来看看 《Fluent Python》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具