Golang的一致性哈希实现

一致性哈希的具体介绍,可以参考:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html

 
 1 import (
2 "hash/crc32"
3 "sort"
4 "strconv"
5 "sync"
6 )
7 ​
8 const DEFAULT_REPLICAS = 100
9 type SortKeys []uint32
10 ​
11 func (sk SortKeys) Len() int {
12 return len(sk)
13 }
14 ​
15 func (sk SortKeys) Less(i, j int) bool {
16 return sk[i] < sk[j]
17 }
18 ​
19 func (sk SortKeys) Swap(i, j int) {
20 sk[i], sk[j] = sk[j], sk[i]
21 }
22 ​
23 type HashRing struct {
24 Nodes map[uint32]string
25 Keys SortKeys
26 sync.RWMutex
27 }
28 ​
29 func (hr *HashRing)New(nodes []string) {
30 if nodes == nil {
31 return
32 }
33 ​
34 hr.Nodes = make(map[uint32]string)
35 hr.Keys = SortKeys{}
36 for _, node := range(nodes) {
37 for i := 0; i < DEFAULT_REPLICAS; i++ {
38 str := node + strconv.Itoa(i)
39 hr.Nodes[hr.hashStr(str)] = node
40 hr.Keys = append(hr.Keys, hr.hashStr(str))
41 }
42 }
43 sort.Sort(hr.Keys)
44 }
45
46 func (hr *HashRing) hashStr(key string) uint32 {
47 return crc32.ChecksumIEEE([]byte(key))
48 }
49
50 func (hr *HashRing) GetNode(key string) string {
51 hr.RLock()
52 defer hr.RUnlock()
53 hash := hr.hashStr(key)
54 i := hr.get_position(hash)
55 return hr.Nodes[hr.Keys[i]]
56 }
57 ​
58 func (hr *HashRing) get_position(hash uint32) int {
59 i := sort.Search(len(hr.Keys), func(i int) bool {
60 return hr.Keys[i] >= hash})
61 ​
62 if i < len(hr.Keys) {
63 if i == len(hr.Keys) - 1 {
64 return 0
65 } else {
66 return i
67 }
68 } else {
69 return len(hr.Keys) - 1
70 }
71 }
72
73

Golang的一致性哈希实现的更多相关文章

  1. 一致性哈希算法和Go语言实现

    一致性哈希算法,当我第一次听到这个名字的时候,感觉特别高深.而它往往会和分布式系统相关,准确的说,是分布式缓存. 在Web服务中,缓存是介于数据库和服务端程序之间的一个东西.在网站的业务还不是很大的时 ...

  2. .net的一致性哈希实现

    最近在项目的微服务架构推进过程中,一个新的服务需要动态伸缩的弹性部署,所有容器化示例组成一个大的工作集群,以分布式处理的方式来完成一项工作,在集群中所有节点的任务分配过程中,由于集群工作节点需要动态增 ...

  3. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  4. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  5. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  6. memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法

    1 网络IO模型 安装memcached需要先安装libevent Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描 ...

  7. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  8. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  9. Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比

    准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...

随机推荐

  1. C++ primer plus读书笔记——第4章 复合类型

    第4章 复合类型 1. 如果将sizeof运算符用于数组名,得到的将是整个数组中的字节数. 2. 如果对数组的一部分进行初始化,则编译器把其他元素设置为0.因此,将数组中的所有元素初始化为0,只要显式 ...

  2. ES6学习-3 const

    const声明一个只读的常量.一旦声明,常量的值就不能改变,所以在声名时就进行赋值. const的作用域与let命令相同,只在声明所在的块级作用域内有效. const命令声明的常量,同样存在暂时性死区 ...

  3. [c++] 常犯错误

    更改变量值时想清楚对后面程序的影响 scnaf & == 数组下标从0开始 不赋初值导致的垃圾数据 全局flag和局部flag

  4. [算法] O(n^2)排序算法的效率比较

    选择.插入排序 main.cpp 1 #include <iostream> 3 #include "SortTestHelper.h" 4 5 using names ...

  5. [刷题] 226 Invert Binary Tree

    要求 翻转一棵二叉树 实现 翻转左右子树,交换左右子树的根节点 1 class Solution { 2 public: 3 TreeNode* invertTree(TreeNode* root) ...

  6. vipivp常用linux命令

    基础安装 # CentOS sudo yum install epel-release 命令行Tips 进程及端口 # 查看端口占用情况 netstat -ap | grep 端口号   # 查看某一 ...

  7. CentOS7中下载RPM及其所有的依赖包

    CentOS7中下载RPM及其所有的依赖包 转载beeworkshop 最后发布于2019-09-28 07:43:40 阅读数 1096  收藏 展开 利用 Downloadonly 插件下载 RP ...

  8. android Room数据库仓库模式

  9. 入坑java工程师那些事

    最近在知乎上看到好多关于转行做java的朋友,有的在担心学历,有的在想着如何学习java,有的在纠结如何面试.作为一个工作了近10年的java程序员来聊聊我的一些想法,主要从学历.个人能力.工作环境等 ...

  10. Go基础结构与类型05---程序运算

    package main import ( "fmt" "math" ) func main() { /*加减乘除,求余*/ fmt.Println(" ...