`
qq466862016
  • 浏览: 125699 次
  • 来自: 杭州
社区版块
存档分类
最新评论

golang 一致哈希

阅读更多

 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.

 

2
6
分享到:
评论

相关推荐

    statsrelay:一个用于statsd的Golang一致性哈希代理

    每个度量标准都使用一致的哈希算法进行哈希处理,以便始终将同一度量标准发送到同一statsd服务器。 这是用Go语言编写的,目标很简单:要快。 当前的statsd发行版附带一个执行相同功能的nodejs代理工具。 但是,该...

    goring:Golang中一个简单的一致哈希环实现

    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 ( ...

    consistent:一个Go库,该库实现一致性哈希和有界负载的一致性哈希

    一致性哈希和有界负载的一致性哈希的Golang实现。 一致的哈希示例 package main import ( "log" "github.com/lafikl/consistent" ) func main () { c := consistent . New () // adds the hosts to the ring ...

    statsd-proxy:用于etsystatsd的快速一致哈希代理

    我们尝试在原始的nodejs代理上使用SO_REUSEPORT ,这使我们能够在单个端口上绑定多个udp套接字,但是nodejs(或libuv)已禁用此选项,而golang则没有方法setsockopt() 。 因此,我们在C语言中做到了。 特征 零依赖...

    适用于go的gRPC负载平衡库-Golang开发

    功能支持随机,RoundRobin和一致性哈希策略。 支持etcd,consul和zookeeper作为注册表。 示例包main imp grpc-lb这是go的gRPC负载平衡库。 功能支持Random,RoundRobin和consistent-hash策略。 支持etcd,consul和...

    blog:算法,WebRTC,节点,微服务,Golang,ELK,Kubernetes,Istio,JAVA,PHP,MongoDB,Ningx,OpenResty,GraphQL ..

    chapin blog微服务架构 & DevOpsK8SService Mesh苏槐系列文章如何快速搭建一个微服务架构微服务架构中...什么是一致性哈希?无序数组排序后的最大相邻差值数据库数据库是如何工作的?高效sql性能优化极简教程Mongo高级

    AnnotatedCode:知名开源代码库的注释版本:C ++,Golang等

    pbrpc RPC暂无木多网络库/React器雷迪斯雷迪斯高朗项目名称关键词注释版原地址博客go / x / time / rate限流器限速限流器组缓存缓存/一致性哈希facebookgo /注入依赖注入Go原始码和标准库更多文章更多文章欢迎关注...

    SaudiOSS:沙特开源项目清单

    沙特开源项目清单: 沙特阿拉伯建立了许多开源项目。 此列表包含其中一些内容,以便每个人都可以从中受益。 该列表是随机排列的,没有顺序的意义。...一个Go库,该库实现一致性哈希和有界负载的一致性哈希

    go-libra:天秤座通过加密验证进入客户端库

    天秤座 用于区块golang客户端库。 感谢 ,go-libra也可以作为Javascript客户端库使用: 。 它适用于NodeJS和浏览器。 它具有所有密码验证算法,包括基于验证者签名的共识验证,分类账历史累加器证明和帐户状态稀疏...

    weaver:具有动态分片策略的高级HTTP反向代理

    描述 Weaver是具有动态分片策略的第7层负载均衡器。... 特征: 基于标题/路径/正文字段的分片请求 ... 一致的哈希(哈希) 基于简单的查询 模数 前缀查询 基于S2 部署到Kubernetes 目前,我们支持正式部署到kube

    ringpop-go:Go应用程序的可扩展,容错应用程序层分片

    它在成员资格协议之上维护了一个一致的哈希环,并提供了请求转发作为路由选择的便利。 它可用于以可扩展和容错的方式来分片您的应用程序。 入门 要安装ringpop-go,请执行以下操作: go get github....

    Gem

    从头开始编写Golang程序 Web框架-GemWeb [Gem]是类似的框架http.Handler接口基本设计灵活的上下文带有Trie-Tree算法路由器组控制中间件机制嵌入式模板支持紧急恢复并使其成为健壮的分布式缓存-GemCache [GemCache]是...

    graviton:重力数据库

    Graviton数据库是纯GOLANG中简单,快速,版本控制,已认证,可嵌入的键值存储数据库。 简而言之,Graviton数据库就像“用于键值存储的ZFS”,其中每个写入都通过加密证明进行跟踪,版本控制和认证。 另外,可以拍摄...

Global site tag (gtag.js) - Google Analytics