Python 集合协调算法的实现

Python 集合协调算法的实现,python,c,algorithm,synchronization,set,Python,C,Algorithm,Synchronization,Set,我正在寻找集合协调算法的实现。问题如下:在不同的机器上,有两组元素由一些相对紧凑的值(例如UUID或MD5/SHA1/任何哈希)标识。这些集合在相对较少的元素上有所不同,我希望在传输最少数据量的同时同步这些集合。大多数谷歌搜索线索。这是GPL对这项任务最先进方法的实现。问题是我不能在我的应用程序中使用GPL'd代码。很可能我必须自己用nzmath之类的东西重新实现它,但可能还有其他实现(最好是Python或C/C++),或者可能有其他更好的算法?无法使用GPL通常是一个抽象问题;也就是说,如果您

我正在寻找集合协调算法的实现。问题如下:在不同的机器上,有两组元素由一些相对紧凑的值(例如UUID或MD5/SHA1/任何哈希)标识。这些集合在相对较少的元素上有所不同,我希望在传输最少数据量的同时同步这些集合。大多数谷歌搜索线索。这是GPL对这项任务最先进方法的实现。问题是我不能在我的应用程序中使用GPL'd代码。很可能我必须自己用nzmath之类的东西重新实现它,但可能还有其他实现(最好是Python或C/C++),或者可能有其他更好的算法?

无法使用GPL通常是一个抽象问题;也就是说,如果您对许可证有问题。因此,如果您创建一个小型GPL应用程序(在GPL下发布),您可以从非GPL应用程序调用它。为什么要重新发明轮子


特别是如果您可以使用已经存在的python脚本:为什么不利用它呢?当然,如果你不能公开元素再整合算法,事情就不同了。

这段代码是我脑子里想不出来的,因此包含在本网站代码样本的任何许可证中

# given two finite sequences of unique and hashable data,
# return needed opcodes and data needed for reconciliation

def set_reconcile(src_seq, dst_seq):
    "Return required operations to mutate src_seq into dst_seq"
    src_set= set(src_seq) # no-op if already of type set
    dst_set= set(dst_seq) # ditto

    for item in src_set - dst_set:
        yield 'delete', item

    for item in dst_set - src_set:
        yield 'create', item
使用方法如下:

for opcode, datum in set_reconcile(machine1_stuff, machine2_stuff):
    if opcode == 'create':
        # act accordingly
    elif opcode == 'delete':
        # likewise
    else:
        raise RuntimeError, 'unexpected opcode'

该项目在OCaml中实现了高效的集合协调。

难道你不能将密钥放入一个文件(排序)并重新同步吗?tonfa:这是一个可能的解决方案,但它没有利用数据顺序无关紧要这一事实。此外,添加/删除的值将均匀分布在整个文件中,导致rsync算法传输大量多余的数据(每个值可能有一个块)。在运行时,可能的差异大小是否有一个已知的界限?您使用的集合有多大?你真的需要使用最先进的技术吗?或者你可以只计算设置的差异并只传输那些元素吗?顺便说一句,不清楚你是想传输密钥,还是要传输附加到密钥上的数据(我假设是密钥)。一个可能的解决方案(近似值)是使用bloom过滤器:我考虑过这样做,但不知何故我对这种GPL解决方案感到不好,因为如果没有它的unGPL包装器,生成的GPL应用程序将非常无用。它仍然符合GPL。其他人可能会重复使用想法,因此它仍然符合GPL的想法。这比重新发明轮子强多了。好吧,但你没有在任何一台机器上同时拥有两套钥匙,这就是问题所在。如果你不能从一台机器上转移钥匙列表,你将如何转移这些物品?请重新说明您的反对意见(如果是)。您要求使用非GPL代码来协调两个集合,我没有看到对管理来回传输的代码的请求,传输的项目要么是唯一ID,要么是项目。问题是,如果您在不同的机器上有两个大的密钥集合,例如UUID,存在一种技巧,允许在不传递太多数据的情况下,在两侧获得这些集合的并集(参见问题中的链接)。在两边都获得了完整的关键列表之后发生的事情是微不足道的,因此对我来说没有什么兴趣。如果在任何非OcAML中都能找到原代码的实现,你是否知道?我在NISLAB中有一个免费的C++版本。