`

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

阅读更多
一、依赖的jar包
[com.google.guava/guava 14.0.1]


二、具体实现
(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


分享到:
评论

相关推荐

    在 Clojure中实现遗传算法的框架_Clojure_代码_下载

    在Clojure中实现遗传算法的框架是一个有趣且富有挑战性的任务,因为Clojure是一种功能编程语言,它提供了独特的视角和工具来处理这类问题。遗传算法(Genetic Algorithms, GA)是一种模拟自然选择和遗传学原理的优化...

    Lacinia纯Clojure实现的GraphQL

    Lacinia的设计理念是保持与GraphQL规范的紧密一致性,同时充分利用Clojure的简洁性和强大的函数式编程特性。由于Clojure是基于Lisp构建的,它具有强大的元编程能力,这使得Lacinia能够构建出高效且易于维护的GraphQL...

    一个基于 Clojure 的音乐语法和算法作曲的相关工具_Clojure_代码_下载

    Music Compojure 是一个基于 Clojure 的音乐语法和算法作曲的相关工具。Music Compojure 不隶属于 Compojure,也不应与 Compojure 混淆,后者是 clojure 的 Web 框架。

    蚂蚁群优化算法演示:使用 Clojure 创建_Clojure _代码_下载

    2. **测试文件**: 使用Clojure的`clojure.test`库进行单元测试,确保算法的正确性。 3. **配置文件**: 可能包括算法参数(如蚂蚁数量、信息素蒸发率、启发式信息权重等)的设置。 4. **示例问题**: 提供一些实际的...

    Clojure中灵活的遗传算法_Clojure_代码_下载

    Darwin 是一个灵活的遗传算法编程框架,旨在研究应用。它与表示无关,对于简单的 GA 示例和对于复杂的遗传编程问题一样有效。它可以配置为执行单目标和多目标优化,包括 SPEA2 算法。它具有自适应进化的功能,其中...

    Python-cljcbloom一个用Clojure脚本实现的跨平台布隆过滤器

    Python-cljcbloom使用Clojure的Java绑定特性,使得这个库能够在任何支持JVM的平台上运行,包括Windows、Linux、macOS等,这样Python开发者无需关心底层实现的平台依赖,可以方便地在不同操作系统上使用。...

    clj-sorting-algorithms:Clojure中实现的排序算法

    在这个名为"clj-sorting-algorithms"的项目中,开发者提供了一系列经典的排序算法实现,旨在展示Clojure语言在处理这类问题时的独特优势。下面我们将深入探讨这些排序算法以及它们在Clojure中的实现。** ### 1. ...

    clojure-manifold:clojure 中的流形学习算法

    clojure_manifold Clojure 中的算法。说明:用法在这两种情况下,M 都是一个矩阵,我们尝试将 M 拟合到 k 维,其中 k < M> ( use 'clojure-manifold.data :reload )niluser> ( def M ( load-data " foo.csv " ))MDS...

    [Clojure] 网络应用开发 (Clojure 实现) (英文版)

    [Pragmatic Bookshelf] 网络应用开发 (Clojure 实现) (英文版) [Pragmatic Bookshelf] Web Development with Clojure Build Bulletproof Web Apps with Less Code (E-Book) ☆ 图书概要:☆ If the usual ...

    Python-利用Clojure实现的一个可拖放的看板示例

    描述简洁地提到是用Clojure实现了看板的拖放功能,Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机上。这暗示了项目可能使用了Clojure的某些库或框架,如Reagent或React,它们允许开发者用Clojure来构建...

    clojure-sha-3-源码.rar

    7. **测试**:为了保证算法的正确性,源码通常会包含测试用例,使用Clojure的测试框架如`clojure.test`来验证不同输入下的哈希计算结果。 了解Clojure SHA-3的源码,不仅可以帮助我们深入理解SHA-3算法的工作原理,...

    blurhash:Blushash算法的Clojure实现

    uNGM{nTNHMzIVnn → Clojure实现是用CLJC文件编写的,因此可以像Clojure和ClojureScript代码一样使用它们。编码方式您可以使用功能blurhash.encode/encode将图像编码为blurhash。 它将图像作为RGB矩阵,当前表示为...

    clojure-algorithms:Clojure中的算法

    2. 查找算法:例如二分查找、哈希表查找等,Clojure的函数式特性使得这些算法可以自然地用函数组合来实现。 3. 图论算法:Clojure可以方便地处理图数据结构,实现Dijkstra最短路径、Floyd-Warshall所有对最短路径等...

    Clojure Data Analysis Cookbook

    - **机器学习基础**:介绍如何使用 Clojure 实现简单的机器学习算法,如线性回归、决策树等。 3. **实践篇**:通过具体的项目案例来巩固前面所学的知识。 - **文本分析**:使用自然语言处理技术进行文本挖掘,如...

    算法音乐工具 的集合_Clojure_代码_下载

    标题中的“算法音乐工具的集合_Clojure_代码_下载”揭示了这是一个关于使用Clojure编程语言构建的算法音乐工具项目。这些工具可能是用于生成、处理或分析音乐的软件,利用算法来创建新颖的音乐体验。Clojure是一种...

    Practical Clojure.pdf

    使用Clojure编程,随着程序的增长,并不会变得更复杂难以理解,反而会变得更简单、表达性更强。Clojure鼓励开发者尝试在其他语言中过于复杂而通常不会尝试的事情,例如并发编程、不可变性和惰性数据结构。因为...

    Clojure编程乐趣]+clojure_programming.pdf

    这种性质使得Clojure代码能够操作自身,实现自我修改,增加了代码的灵活性。同时,Clojure提供了强大的映射(map)、序列(sequence)和集合(set)操作,以及高阶函数,如`map`、`filter`和`reduce`,这些都极大地...

    clojure1.3.0及资料

    Clojure的设计目标是提供一种静态类型的、并发的、内存安全的语言,同时保持Lisp的简洁性和灵活性。在这个压缩包文件中,包含了一些关于Clojure的重要资源,特别是对于学习和理解Clojure 1.3.0版本非常有帮助。 1. ...

Global site tag (gtag.js) - Google Analytics