用clojure实现一致性哈希算法(consistent hashing)

一、[b]依赖的jar包[/b]

[com.google.guava/guava 14.0.1]


[b]二、具体实现[/b]

(defn vnodes
"生成n个随机的vnode"
[n]
(vec (sort (repeatedly n #(rand-int 65536)))))

(defn short-hash
"产生一个0..2^16范围的hash值"
[s]
;; SHA-1 used for uniform value distribution
(bit-and (->> (.hashString (com.google.common.hash.Hashing/sha1) s) (.asInt)) 0xffff))

(defn closest-before
"查找之前最近的一个vnode"
[coll el]
(let [idx (java.util.Collections/binarySearch coll el compare)]
(cond
(= -1 idx) -1 ;;
(neg? idx) (coll (- -2 idx))
:else (coll idx))))

(defn responsible
"超找某个数据hash之后应该属于哪个node。因为一个node包含一组vnode。所以多了个这个方法,不然用到closest-before其实就够了。"
[hash ^List ring]
(let [found (apply max-key #(closest-before % hash) ring)]
(.lastIndexOf ring found)))



(closest-before [1 2 3 4 20 30 60 80 1020 34045] 50)
;;==>30
;;假设有node1:[100 200 300]。100,200,300是vnode。
;;假设有node2:[400 500 600]。
;;结果为1。可以把这连个node串成一个环(ring)来看。往前找最近的,就是node2了。所以返回index值为1。
(responsible 50 [[100 200 300] [400 500 600]] )
;;==> 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值