这段代码实现了一个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. luogu 3676小清新数据结构题

    真·小清新... 其实本题正解是动态点分治,但是考虑到那个东西需要先大力推导一波再套上一个幻想乡战略游戏的搞法,所以还不如大力推导一波,然后无脑套上一个树剖+线段树写法... 首先我们考虑没有换根操作 ...

  2. LCP 34. 二叉树染色

    class Solution: def maxValue(self, root: TreeNode, k: int) -> int: def dfs(root): # 空节点价值全为0 res ...

  3. Windows如何生成公钥和私钥

    Windows如何生成公钥和私钥 方法一)使用git命令 一. 首先安装git二. 桌面上右键 Git Bash Here三. 命令ssh-keygen -t rsa然后 一直enter 四. 将公钥 ...

  4. MySQL中的json函数

    json_valid 判断是否为合法json文档 json_unquote 去除json字符串的引号,将值转成string类型 json_extract 提取json值

  5. 【APT】响尾蛇(SideWinder)APT组织样本分析

    基础信息 名称:NDC Participants.docx类型:.docMD5:df020e81b7ca32868a8ac1f5eddd086f描述:通过远程模板注入技术加载含有CVE-2017-11 ...

  6. function | ECOS

    用于优化线性或二阶锥的自对偶齐次嵌入内点方法. 不支持 SDP 锥体! [x,y,info,s,z] = ecos(c,G,h,dims,A,b) 求解一对原始和双锥程序 最小化 c'x 服从 Gx ...

  7. Navicat15激活

    1.下载Navicat for MySQL 15 https://www.navicat.com.cn/download/navicat-for-mysql 2.下载激活工具 注意:因某些限制,下载链 ...

  8. 使用navicat连接本地数据库时,出现错误1251错误

    在安装完MySQL的时候,我们现在一般都使用Navicat来连接数据库,可惜出现下面的错误:1251-Client does not support authentication protocol r ...

  9. JS实现一个函数getType获取所有的数据类型

    1 function getType(obj) { 2 if (obj === null) { 3 return String(obj) 4 } 5 const toType = (obj) => ...

  10. 解决和根源:Unsolicited response received on idle HTTP channel starting with xxx

    环境:golang,使用http client,服务器:iis +aspx.net动作:head请求或其他此问题见于各种请求情况.核心是,http在活动期间收到了非预期的信息.一开始我也很纳-闷,因为 ...