golang 实现一致哈希
package consistenthash import ( "hash/crc32" "sort" "strconv" ) type Hash func(data []byte) uint32 type Map struct { hash Hash replication int keys []int hashMap map[int]string } func New(replication int, fn Hash) *Map { m := &Map{ replication: replication, hashMap: make(map[int]string), hash: fn, } if m.hash == nil { m.hash = crc32.ChecksumIEEE } return m } func (m *Map) Add(keys ...string) { for _, key := range keys { for i := 0; i < m.replication; i++ { hs := int(m.hash([]byte(key + strconv.Itoa(i)))) m.keys = append(m.keys, hs) m.hashMap[hs] = key } } sort.Ints(m.keys) } func (m *Map) Get(key string) string { if m.IsEmpty() { return "" } hs := int(m.hash([]byte(key))) ind := sort.Search(len(m.keys), func(n int) bool { return m.keys[n] >= hs }) if ind == len(m.keys) { ind = 0 } return m.hashMap[m.keys[ind]] } func (m *Map) IsEmpty() bool { return len(m.keys) == 0 }
package main import ( "consistenthash" "fmt" ) func main() { hash := consistenthash.New(10, nil) hash.Add("192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.1.104", "192.168.1.105") fmt.Println(hash.Get("dongtian")) fmt.Println(hash.Get("dongtian1")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("dongtian2")) fmt.Println(hash.Get("11")) fmt.Println(hash.Get("12")) fmt.Println(hash.Get("13")) }
/Users/dongtian/Desktop/soft/wp/golang/go/bin/go build -i [/Users/dongtian/Desktop/soft/wp/golang/stu/src/te] 成功: 进程退出代码 0. /Users/dongtian/Desktop/soft/wp/golang/stu/src/te/te [/Users/dongtian/Desktop/soft/wp/golang/stu/src/te] 192.168.1.103 192.168.1.101 192.168.1.101 192.168.1.101 192.168.1.101 192.168.1.101 192.168.1.101 192.168.1.101 192.168.1.102 192.168.1.103 192.168.1.102 成功: 进程退出代码 0.
相关推荐
每个度量标准都使用一致的哈希算法进行哈希处理,以便始终将同一度量标准发送到同一statsd服务器。 这是用Go语言编写的,目标很简单:要快。 当前的statsd发行版附带一个执行相同功能的nodejs代理工具。 但是,该...
ring Golang中一个简单的一致哈希环实现#用法 import ( "fmt" "github.com/alash3al/goring" ) func main (){ // init ring := new ring . NewRing () // add node with its weight in the ring ring . Add ( ...
一致性哈希和有界负载的一致性哈希的Golang实现。 一致的哈希示例 package main import ( "log" "github.com/lafikl/consistent" ) func main () { c := consistent . New () // adds the hosts to the ring ...
我们尝试在原始的nodejs代理上使用SO_REUSEPORT ,这使我们能够在单个端口上绑定多个udp套接字,但是nodejs(或libuv)已禁用此选项,而golang则没有方法setsockopt() 。 因此,我们在C语言中做到了。 特征 零依赖...
功能支持随机,RoundRobin和一致性哈希策略。 支持etcd,consul和zookeeper作为注册表。 示例包main imp grpc-lb这是go的gRPC负载平衡库。 功能支持Random,RoundRobin和consistent-hash策略。 支持etcd,consul和...
chapin blog微服务架构 & DevOpsK8SService Mesh苏槐系列文章如何快速搭建一个微服务架构微服务架构中...什么是一致性哈希?无序数组排序后的最大相邻差值数据库数据库是如何工作的?高效sql性能优化极简教程Mongo高级
pbrpc RPC暂无木多网络库/React器雷迪斯雷迪斯高朗项目名称关键词注释版原地址博客go / x / time / rate限流器限速限流器组缓存缓存/一致性哈希facebookgo /注入依赖注入Go原始码和标准库更多文章更多文章欢迎关注...
沙特开源项目清单: 沙特阿拉伯建立了许多开源项目。 此列表包含其中一些内容,以便每个人都可以从中受益。 该列表是随机排列的,没有顺序的意义。...一个Go库,该库实现一致性哈希和有界负载的一致性哈希
天秤座 用于区块golang客户端库。 感谢 ,go-libra也可以作为Javascript客户端库使用: 。 它适用于NodeJS和浏览器。 它具有所有密码验证算法,包括基于验证者签名的共识验证,分类账历史累加器证明和帐户状态稀疏...
描述 Weaver是具有动态分片策略的第7层负载均衡器。... 特征: 基于标题/路径/正文字段的分片请求 ... 一致的哈希(哈希) 基于简单的查询 模数 前缀查询 基于S2 部署到Kubernetes 目前,我们支持正式部署到kube
它在成员资格协议之上维护了一个一致的哈希环,并提供了请求转发作为路由选择的便利。 它可用于以可扩展和容错的方式来分片您的应用程序。 入门 要安装ringpop-go,请执行以下操作: go get github....
从头开始编写Golang程序 Web框架-GemWeb [Gem]是类似的框架http.Handler接口基本设计灵活的上下文带有Trie-Tree算法路由器组控制中间件机制嵌入式模板支持紧急恢复并使其成为健壮的分布式缓存-GemCache [GemCache]是...
Graviton数据库是纯GOLANG中简单,快速,版本控制,已认证,可嵌入的键值存储数据库。 简而言之,Graviton数据库就像“用于键值存储的ZFS”,其中每个写入都通过加密证明进行跟踪,版本控制和认证。 另外,可以拍摄...