我正在寻找set reconciliation算法的实现。问题在于:有两个集合,其中元素由位于不同机器上的一些相对紧凑的值(例如,UUID或MD5 / SHA1 /任何散列)标识。这些集合的元素相对较少,我希望在传输最少量的数据时同步这些集合。大多数谷歌搜索引导here。这是GPL实施的似乎是最先进的任务方法。问题是我不能在我的应用程序中使用GPL代码。最有可能的是我必须使用类似nzmath的东西重新实现它,但也许还有其他实现(最好是Python或C / C ++),或者还有其他更好的算法?
答案 0 :(得分:1)
无法使用GPL通常是抽象的问题;如果它是您遇到问题的许可证。因此,如果您创建一个小型GPL应用程序(在GPL下发布),您可以从非GPL应用程序中调用它。为什么重新发明轮子?
特别是如果你可以使用已经存在的python脚本:为什么不利用它呢?当然,如果你不能公开元素重新整合算法,情况会有所不同。
答案 1 :(得分:1)
此代码不在我的脑海中,因此适用于本网站代码示例的任何许可证。
# 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'
答案 2 :(得分:0)
Synchronizing Keyserver项目在OCaml中实现了有效的集合协调。