这段代码实现了一个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. POJ--1852-c++实现

    因为蚂蚁的朝向不明确,所以,可以根据需要假定朝向方向 首先,当每只蚂蚁朝着离自己最近的端点前进,且不回头则,所需总时间最少 当每只蚂蚁朝着离自己最远的端点前进,所需时间最多,在这期间,会碰到其他蚂蚁, ...

  2. 解决vuex“状态管理声明输错”后报错为:"Uncaught TypeError: __WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor"

    //Vuex index.js 源码 import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); import actions fro ...

  3. 【python】绘图坐标轴标题中包含上标或下标

    plt.ylabel("流量($\mathregular{m^3}$/s)")          #绘图坐标轴添加上标$\mathregular{m^3}$,若是下标m_3 不加m ...

  4. docker命令、简单创建镜像、dockerfile实战、Dockerfile语法、镜像分层、Volume介绍

    docker的常用命令: docker pull 获取imagedocker build 创建imagedocker images 列出imagedocker run 运行containerdocke ...

  5. SQL-while begin end

    declare @i int set @i=1 while @i<=10000000begin insert into dbo.Persons (Age,Sex,Grade,Name) valu ...

  6. java整合SSM框架

    使用Myeclipse搭建maven项目 准备工作 安装maven 官网下载安装(http://maven.apache.org/)    配置环境变量      配置完后,使用命令行输入mvn -v ...

  7. CentOS7/6 关闭防火墙(转载)

    CentOS6关闭防火墙使用以下命令, //临时关闭 service iptables stop //禁止开机启动 chkconfig iptables off CentOS7中若使用同样的命令会报错 ...

  8. deepin 调整微信、百度网盘、迅雷等等软件字体的方法

    一.修改微信字体大小方法: 1.方法一:修改deepinwine桌面环境字体 env WINEPREFIX="$HOME/.deepinwine/Deepin-WeChat" wi ...

  9. 2003031118-李伟-Python数据分析第三周作业-第一次作业

    项目 NumPy数值计算基础 博客名称 2003031118-李伟-Python数据分析第三周作业-第一次作业 课程班级博客链接 https://edu.cnblogs.com/campus/pexy ...

  10. 十大经典排序之桶排序(C++实现)

    桶排序 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定 思路: 根据数据规模,初始化合理桶数 将数列中的数据按照桶的规模进行映射,尽量保证数据被均匀的分布到桶 ...