- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
以下是线性同余的一致性 Hash 算法的全部代码。
输入参数分别是 64 位的 key 和桶的数量(一般对于服务节点的数量),输出一个桶的编号(从0开始)。
package consistenthash;
/**
* @className: JumpConsistentHash
* @description: 利用线性同余的一致性 Hash 算法
* @date: 2022/2/1
* @author: 贝医
*/
public class JumpConsistentHash {
private static final long UNSIGNED_MASK = 0x7fffffffffffffffL;
private static final long JUMP = 1L << 31;
private static final long CONSTANT = Long
.parseUnsignedLong("2862933555777941757");
private JumpConsistentHash() {
throw new AssertionError(
"No com.github.ssedano.hash.JumpConsistentHash instances for you!");
}
/**
* @param o 对象
* @param buckets 桶的个数
* @return int 节点
*/
public static int jumpConsistentHash(final Object o, final int buckets) {
return jumpConsistentHash(o.hashCode(), buckets);
}
/**
* @param key 键
* @param buckets 桶的个数
* @return the hash of the key
* @throws IllegalArgumentException if buckets is less than 0
*/
public static int jumpConsistentHash(final long key, final int buckets) {
checkBuckets(buckets);
long k = key;
long b = -1;
long j = 0;
while (j < buckets) {
b = j;
k = k * CONSTANT + 1L;
j = (long) ((b + 1L) * (JUMP / toDouble((k >>> 33) + 1L)));
}
return (int) b;
}
private static void checkBuckets(final int buckets) {
if (buckets < 0) {
throw new IllegalArgumentException("Buckets cannot be less than 0");
}
}
private static double toDouble(final long n) {
double d = n & UNSIGNED_MASK;
if (n < 0) {
d += 0x1.0p63;
}
return d;
}
public static void main(String[] args) {
for (int i = 0; i < 35; i++) {
int node = jumpConsistentHash(i, 7);
System.out.println("选中节点为" + node);
}
}
}
选中节点为:0
选中节点为:6
选中节点为:6
选中节点为:3
选中节点为:1
选中节点为:4
选中节点为:5
选中节点为:0
选中节点为:4
选中节点为:2
选中节点为:6
选中节点为:5
选中节点为:1
选中节点为:0
选中节点为:5
选中节点为:4
选中节点为:2
选中节点为:4
选中节点为:4
选中节点为:6
选中节点为:0
选中节点为:3
选中节点为:6
选中节点为:3
选中节点为:1
选中节点为:5
选中节点为:0
选中节点为:6
选中节点为:2
选中节点为:5
选中节点为:3
选中节点为:6
选中节点为:1
选中节点为:0
选中节点为:6
Process finished with exit code 0
该算法适用于分布式存储产品,而不太适合用于缓存类型的产品。因为当有节点不可用时, jump consistent hash 算法用存活节点分担不可用节点能力不强,当有节点失效要把数据迁移到其他节点时,会造成大量的数据被移动。但在分布式存储产品中,主节点不可用时会把访问主节点的请求路由到备节点,key 的分布不会有变化。
该算法适合用在分布式系统中根据 key 来选择被分配到的服务的场景。每次新增服务节点时,只有 1/n 的 key 会变动,不会因为扩容或缩容的瞬间造成大部分缓存失效。
和其他一致性 Hash 算法相比,如果中间的桶失效,则该算法是不能像其他一致性算法一样把失效的数据均匀分配到其他节点的,只能找到一个新的节点替换。
不用存储过多节点信息,计算量小,运行快速、代码短,易于实现。
一致性哈希算法(三)- 跳跃一致性哈希法 | 春水煎茶 - 王超的个人博客
GitHub - ssedano/jump-consistent-hash: Java implementation of the jump consistent hash
我正在尝试使用 Rust 的 std::hash 函数: use std::hash::{hash, Hash, SipHasher}; #[test] fn hash_test() { pr
我有以下内容 friends = [{ name: "Jack", attr1:"def", attr2:"def" }, { name: "Jill", attr1:"def", attr2:"de
我有以下数组: names = [ {"Adriana"=>{:gender=>"female", :nationality=>"danish"}}, {"Adriane"=>{:gender=>"f
我有一个哈希的 Perl 哈希......大约 11 或 12 个元素深。请原谅我没有重复下面的结构! 一些级别有固定的标签,例如'NAMES' , 'AGES'或类似的,因此访问这些级别很好,因为我
我试图派生一个描述结构化值的Graphviz文件。这是出于诊断目的,因此我希望我的图形尽可能接近地反射(reflect)内存中的实际结构。我正在使用下面的方法将值映射到Graphviz顶点,以便当一个
我正在尝试获取在 xlm 中传递的事件日志条目,将它们转换为散列,然后存储到数据库中。 我目前正在使用 XmlSimple gem 将 xml 输入转换为散列。 测试样本输入: require 'xm
对于 Ruby 中的 Hash,reject! 和 reject 与 delete_if 有何不同?谁能用简单的代码片段解释它们之间的区别? 最佳答案 由于其他答案指的是 Array#delete_i
我正在尝试处理我使用 Data::Dumper 输出的 perl 数据结构 $VAR1 = 'GAHD'; $VAR2 = [ { 'COUNTRY' => 'US',
无法使用来自辅助进程的现有 rte Hash: h = rte_hash_find_existing("some_hash"); if (h) { // this will w
我有一个散列的散列,其中第一个键是一个字符串,第二个键是一个整数。我试图在散列的散列中获得最低的第二个键。这是我的哈希。 %HoH = ( flintstones => { 8
如何从一系列数组中生成哈希中的哈希?我需要从这里开始: my @data = /one two three/; my $value = 13: 为此: $hoh = { 'one' => { 'two
我有这个配置文件 dbUser=customer dbPass=passwrd dbSid=customer.shadow passwdFile=/production/etc-user tmpUse
我想实现一种thing,可以唯一标识,除此之外,它不包含其他字段。它有点像 ruby 中的 BasicObject 或 java 中的 Object。 我添加了一个 PartialEq 特征。 s
我正在尝试使用以下键存储二维哈希: 维度 1 = 数字但不连续 维度 2 = 字符串(如 :id 和 :value) 当元素未初始化时会出现问题。 memory = Hash.new(Hash.new
我目前正在学习 Michael Hartl 的 Ruby on Rails 教程 不理解在 section 4.4.1 中找到的此语句的含义: Hashes, in contrast, are dif
我很乐意通过更短的表达式访问多维哈希数组的任何元素 h = {a: {b: 'c'}} # default way p h[:a][:b] # => "c" # a nicer way p h[:a,
我想在编写 flutter channel beta 后运行 flutter web 它回复:Can't load kernel binary:Invalid SDK hash,你知道如何解决这个问题
我最近正在研究 Amazon 提供的新 NoSQL 服务,更具体地说是 DynamoDB。 亚马逊说你应该避免使用不均匀分布的键作为主键,即主键应该越独特越好。我可以认为这是最好的情况下每个项目都有唯
我的游戏中有很多哈希值,例如 HMSET('hash1', 'level', 25, 'connected', 2) HMSET('hash2', 'level', 50, 'connected',
我必须翻译这句话:'Susspected overpass-the-hash attack (Kerberos)' 我发现了这篇关于立交桥哈希的文章:https://blog.stealthbits.
我是一名优秀的程序员,十分优秀!