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

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
分享到:
评论

相关推荐

    Go-Meow哈希的Golang实现非常快速的非加密哈希

    在分布式系统中,它可以作为一致性哈希的一部分,帮助实现负载均衡和数据复制。另外,Go-Meow哈希还可以用于文件完整性校验,确保数据在传输或存储过程中没有被篡改。 总之,Go-Meow哈希的Golang实现结合了Meow哈希...

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

    Golang在京东的使用.pptx

    对于Session信息存储,采用了分布式缓存Redis,通过Twemproxy实现一致性哈希和主从+VIP模式,简化了部署和管理。 消息路由算法针对移动网络的不稳定性,引入了Session ID,每个服务器分配唯一的Session ID,以解决...

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

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

    Go-Animal是一个用Golang实现并使用OpenGL的现代终端模拟器

    6. **跨平台兼容**:由于使用了Golang和OpenGL,Go-Animal能够轻松适应各种操作系统,保持一致的外观和行为。 在压缩包中的`liamg-animal-fe1be55`可能是指项目的源代码仓库的一个特定版本,`fe1be55`是Git仓库中的...

    golang实现的文件去重小工具,有git提交历史、注释、windows,linux可执行文件。

    在Golang中,可以使用`io/ioutil`和`crypto/md5`等标准库来读取和计算文件的哈希值。 在代码开发过程中,良好的版本控制是必不可少的。项目中提到了Git,这是一种分布式版本控制系统,用于跟踪对文件的修改历史。...

    Go-BundleDB是Golang的嵌入式数据库其集合随着它们的增长而自动分裂

    Go-BundleDB采用了特定的数据结构来组织和索引数据,可能包括B树或哈希表等,以便于快速查找和更新键值对。每个分裂后的片段都有独立的索引,使得数据访问更为高效。同时,通过序列化和反序列化技术,数据在磁盘和...

    Go-concurrentcache是一款golang的内存缓存库多段设计支持并发写

    在读取方面,`concurrentcache`可能采用一致性哈希或者简单的索引来定位数据。这使得读操作可以在不持有锁的情况下快速完成,提高了读取速度。同时,为了防止过多的内存消耗,可能还包含了一些过期策略,比如LRU...

    golang标准库中文手册,仅供学习

    5. **sync** 和 **atomic**:这两个包用于线程同步和原子操作,保证在多并发环境下的数据一致性。 6. **time**:提供时间操作,如获取当前时间、定时器、延时等功能。 7. **encoding/json**:JSON编码和解码,是...

    数据库内部概念和算法在Golang中的原型实现.zip

    此外,哈希索引适用于等值查询,但不支持范围查询,它通过哈希函数将键映射到特定位置。 事务处理是数据库操作的重要部分,它确保了数据的一致性和完整性。ACID(原子性、一致性、隔离性、持久性)是事务处理的四个...

    golang整合mod(跨module引用)

    标题中的“golang整合mod(跨module引用)”指的是如何在不同的Go模块之间进行依赖引用。 1. **Go Modules基础知识** - **模块定义**:一个模块是由一个或多个Go源代码包组成,它们共享相同的导入路径前缀,通常对应...

    Go-Golang无锁线程安全的HashMap为最快的读取访问进行了优化

    开放寻址法是通过重新散列找到空槽位,而链表法则是在哈希槽位上挂接链表,每个槽位对应一个链表,节点在链表中按哈希顺序排列。 6. **性能优化**:为了优化读取访问速度,可以采用预读取(Prefetching)技术,提前...

    sharding:Golang 的分片支持

    通过算法(如一致性哈希)可以确保数据在各个节点间均匀分布,同时避免因数据迁移导致的性能波动。 5. **分片的查询与合并** 查询时,需要根据查询条件确定数据可能所在的切片,然后对这些切片进行并发查询。查询...

    基于golang和postgresql数据库的家族管理系统源码.zip

    此外,Golang的并发控制机制确保了在多用户环境下数据的一致性。 数据库设计是家族管理系统的关键部分。PostgreSQL支持自定义数据类型,这使得我们可以为家族成员创建包含多种信息的复杂记录。例如,可以定义一个...

    Golang_GoBitalostored是基于bitalosdbself开发的兼容Redis协议的高性能分布式存储系.zip

    在分布式存储方面,GoBitalo Stored可能采用了分片(sharding)、复制(replication)和一致性哈希(consistent hashing)等技术,以实现数据的高可用性和容错性。分片策略可以帮助将数据均匀分布到多个节点,提高...

    Golang的限价订单匹配引擎.zip

    6. **并发控制**:在Golang中,可以通过互斥锁(mutexes)、读写锁(RWMutex)或其他同步原语来保证数据一致性。在订单匹配过程中,对订单簿的修改需要原子操作,防止竞态条件。 7. **性能优化**:为了提高匹配引擎...

    基于Golang的分布式态势感知系统系统.zip

    同时,可能使用一致性哈希算法或者服务发现机制(如Etcd或Consul)来保证数据的均衡分布和服务的动态扩展。 系统可能包括以下几个组件: 1. 数据采集器:这部分负责从网络、日志、设备等多源收集数据,可能使用SNMP...

    yescrypt_gsoc:GSOC15 的 Yescrypt 哈希算法的多种语言实现

    他们可能还编写了测试用例来验证不同语言实现的正确性和一致性,确保无论在哪种语言环境中,Yescrypt 都能产生相同的哈希结果。 在实际应用中,Yescrypt 通常与安全认证系统结合使用,例如在用户注册或登录时对密码...

Global site tag (gtag.js) - Google Analytics