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

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

    dongle-golang资源

    在这个上下文中,哈希算法的测试确保了不同输入数据能够产生一致的输出结果,并且具有抗碰撞性。 cipher.go文件可能是实现了通用的加密解密接口或者包含了加密算法的通用处理逻辑,这样的设计可以使得使用者能够更...

    (源码)基于Golang的分布式缓存系统GeeCache.zip

    通过运用一致性哈希算法和LRU策略,提供高性能、可扩展的缓存方案。 ## 项目的主要特性和功能 1. 运用一致性哈希算法确定数据存储位置,实现数据均匀分布与节点动态增减。 2. 采用LRU算法自动淘汰最久未使用数据,...

    gofs-Golang资源

    gofs-Golang资源涵盖了Golang语言开发的相关工具和文档,为开发者提供了一套完整的资源集合,便于...通过这些文件,gofs-Golang资源为开发者提供了一套完整的项目结构模板,有助于提高开发效率,确保项目质量和一致性。

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

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

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

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

    arlog-golang资源

    更重要的是“go.mod”和“go.sum”文件,它们是Go模块系统的核心文件,go.mod定义了项目的依赖关系,而go.sum则包含了依赖项的特定版本的哈希值,确保依赖的一致性和项目的可重现性。 在代码的组织结构方面,...

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

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

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

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

    moredoc-golang资源

    go.sum则包含了项目依赖模块的预期加密哈希值,它用于验证下载的模块是否未被篡改,保证了依赖的安全性。 app.example.toml是Tom's Obvious, Minimal Language(TOML)的配置文件示例,它是一种轻量级的配置文件...

    gotdx-golang资源

    而go.sum文件则保存了所有依赖模块的特定版本的加密哈希值,用于确保这些依赖模块的一致性和完整性。这两个文件共同构成了Go的模块化依赖管理机制,确保了项目依赖的准确性和可靠性。 readme.txt文件是项目的说明...

    大厂Golang开发工程师面试题集锦

    一致性哈希算法用于解决分布式系统中负载均衡问题,以优化资源分配。 4. Go语言基础知识: Go语言的channel是并发编程中重要的通信机制,close后的channel读取会出现问题。了解slice和array的区别,对于内存管理有...

    bali-golang资源

    go.mod文件记录了项目的模块信息和依赖,go.sum文件则存储了依赖项的特定版本的哈希值,确保依赖的完整性和一致性。 bali.toml文件很可能是一个配置文件,它以toml格式(一种轻量级配置文件格式)存储了项目配置...

Global site tag (gtag.js) - Google Analytics