这段代码实现了一个VClock类,它是基于GCounter实现的。VClock是一种向量时钟,它可以用于在分布式系统中对事件发生的顺序进行排序。VClock的实现方式是将每个节点的计数器值存储在一个字典中,字典的键是节点的标识符,值是计数器的值。compare函数用于比较两个VClock的大小,它会遍历两个VClock中所有的节点,比较它们的计数器值,如果两个VClock的计数器值相等,则返回Ord.Eq;如果a的计数器值都小于等于b的计数器值,则返回Ord.Lt;如果a的计数器值都大于等于b的计数器值,则返回Ord.Gt;否则返回Ord.Cc。

Python代码:

from enum import Enum
import GCounter class Ord(Enum):
Lt = -1 # lower
Eq = 0 # equal
Gt = 1 # greater
Cc = 2 # councurrent VClock = GCounter.GCounter
zero = GCounter.zero
inc = GCounter.inc
merge = GCounter.merge def compare(a: VClock, b:VClock):
compare_list = [a.get(key, 0) - b.get(key, 0) for key in set(a.keys()) | set(b.keys())]
eq = True; le = True; ge = True
for ret in compare_list:
if (ret != 0):
eq = False
if (ret > 0):
le = False
if (ret < 0):
ge = False if (eq):
return Ord.Eq
if (le):
return Ord.Lt
if (ge):
return Ord.Gt
return Ord.Cc

Java代码:

import java.util.HashMap;
import java.util.Map; public class VClock {
private Map<String, Integer> counter; public VClock() {
counter = new HashMap<>();
} public void inc(String nodeId) {
counter.put(nodeId, counter.getOrDefault(nodeId, 0) + 1);
} public static VClock zero() {
return new VClock();
} public static VClock merge(VClock a, VClock b) {
VClock result = new VClock();
for (String key : a.counter.keySet()) {
result.counter.put(key, a.counter.get(key));
}
for (String key : b.counter.keySet()) {
result.counter.put(key, Math.max(result.counter.getOrDefault(key, 0), b.counter.get(key)));
}
return result;
} public Ord compare(VClock other) {
boolean eq = true, le = true, ge = true;
for (String key : counter.keySet()) {
int a = counter.get(key);
int b = other.counter.getOrDefault(key, 0);
if (a != b) {
eq = false;
}
if (a > b) {
le = false;
}
if (a < b) {
ge = false;
}
}
if (eq) {
return Ord.Eq;
}
if (le) {
return Ord.Lt;
}
if (ge) {
return Ord.Gt;
}
return Ord.Cc;
}
} enum Ord {
Lt, Eq, Gt, Cc
}

实现一个CRDT工具库——VClock 时钟向量类的更多相关文章

  1. 如何手写一个js工具库?同时发布到npm上

    自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...

  2. [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)

    所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...

  3. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)

    我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...

  4. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)

    本文,我们接着之前的框架继续扩展,这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容, 如果第二个参数没有传递,返回的是找到的第一个参数 ...

  5. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)

    在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...

  6. [C++][代码库]Vector3空间向量类

    本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 + - * /算术运算 2 向量的数量积,又叫:点乘 3 向量的向量积,又叫:叉乘 4 向量单位化(normalization) ...

  7. 一个PHP高性能、多并发、restful的工具库(基于multi_curl)

    This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...

  8. Underscore.js工具库

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...

  9. JavaScript工具库

    jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...

  10. 手把手教你使用Rollup打包📦并发布自己的工具库🔧

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

随机推荐

  1. 学习笔记||Vue踩过的坑3.0

    11.VUE之const,var,let VUE-var 用var命令声明的变量,是在全局范围内有效的 VUE-let let声明的变量,只是在当前循环的代码块中有效. let不允许在相同的作用域内重 ...

  2. 20 local_settings文件配置 && .gitignore

    1 local_settings 第一步:需要在项目根目录下的settings配置如下 try: from .local_settings import * except Exception: pas ...

  3. 微信小程序——计算器

    知识点: wxml: hover-class: 实现点击态效果 hover-class样式显示的原理是 点击时把样式加到class的样式中,冲突时,谁在后面就显示谁! data-val: 用于传数据, ...

  4. test image size

    676KB - jpg 2.5M jpg 3.8M-jpg 4M

  5. linux-vi/vim常用操作键

    命令模式: :w 将编辑的数据写入硬盘档案中(常用) :w! 若文件属性为『只读』时,强制写入该档案.不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊! :q 离开 vi (常用) :q! 若 ...

  6. Redis Template部分接口学习记录

    Redis Template是操作redis的一个封装模板,让我们更加简便的去操作redis. 操作键类型的接口: GeoOperations Redis的地理空间操作,如GEOADD,GEORADI ...

  7. java中锁的应用(ReentrantLock)

    package com.xielu.test; public class explicit { private static Lock lock = new ReentrantLock(); priv ...

  8. 云服务器搭建redis主从复制以及哨兵模式(附踩坑记录)

    云服务器搭建redis主从复制以及哨兵模式(附踩坑记录) 踩坑记录见最后 搭建一主两从: 在根目录下任意新建一个目录/myredis来存放配置文件: 将我们常用的redis.conf文件拷贝到该目录下 ...

  9. Python爬虫iP被封的怎么办?

    对于经常做数据爬虫的程序员来说,除了要写出简洁方便的代码.还需要解决的是网站反爬的问题.有时候我们在爬取数据的时候突然报出错或者目标网站错误代码. 比如说:403 Forbidden错误," ...

  10. idea中ueditor的入门

    首先在https://github.com/fex-team/ueditor下载ueditor1_4_3_3-utf8-jsp.zip:解压去掉里边jsp中的bin目录放到项目中的webapp中: 添 ...