3.go开源groupcache项目——consistenthash代码
Consistenthash代码是提供ring hash的实现。
包含两个文件consistenthash.go和consistenthash_test.go。
包名叫做consistenthash
定义了一个Hash 函数,一个Map结构体。
1 Map结构体
定义一个hash变量,为函数返回无符号整数
一个INT的变量
一个INT数组
和一个map类型变量hashMap.
2 New函数
入参为一个整形和一个函数。
整形replicas作用是往里add的时候需要复制的数量,其实也是多少键映射一个哈希值的含义在里面。
创建一个Map结构体。其中结构体中的hashMap使用make创建。
如果函数为nil,则赋值为crc32.ChecksumIEEE
3 IsEmpty函数
判断Map结构体中keys的数量是否为0.
4 Add函数
入参为可变字符串。
将键增加到hash中。
通过range来获取入参,然后
将入参根据定义的哈希函数进行哈希得到哈希值。
将Map结构体中的keys整形数组增加一个值,该哈希值。
同时将入参变量加入到Map结构体中的hashMap变量中(map结构体),入参为键,哈希值为键值。
5 Get函数
入参为一个键值(字符串),根据提供的键来获取接近的字符串。
先判断是否为空。
然后根据根据字符串来计算得到哈希值。
然后根据sort包中的search函数,Search()方法使用“二分查找”算法来搜索某指定切片[0:n],并返回能够使f(i)=true的最小的i(0<=i<n)值,并且会假定,如果f(i)=true,则f(i+1)=true,即对于切片[0:n],i之前的切片元素会使f()函数返回false,i及i之后的元素会使f()函数返回true。但是,当在切片中无法找到时f(i)=true的i时(此时切片元素都不能使f()函数返回true),Search()方法会返回n(而不是返回-1)。
如果没找到,则返回0.
最后返回Map结构体中hashMap变量中的对应的哈希值。
有疑问加站长微信联系(非本文作者)