C++ 网络上的分布式标识符

C++ 网络上的分布式标识符,c++,networking,synchronization,distributed,identity,C++,Networking,Synchronization,Distributed,Identity,我需要创建一个基于标识符(自动生成、数字、可重用)的对象相互通信的分布式网络。如何在图形的每个节点上创建对象而不创建碰撞 目前,我正在使用主节点分配ID,但此解决方案涉及在其他节点上异步创建对象,我想删除这些对象。特别是因为应用程序是实时的,所以RDBMS是不可能的 我知道这是一个相当经典的分布式计算问题,但我可能缺乏适当搜索的词汇表 TCP是我唯一可以使用的协议,网络会受到延迟的影响。如果它是重要的,我在C++中工作,但是我在寻找一个算法,而不是一个库。 你可能喜欢使用s作为标识符,它们是唯一

我需要创建一个基于标识符(自动生成、数字、可重用)的对象相互通信的分布式网络。如何在图形的每个节点上创建对象而不创建碰撞

目前,我正在使用主节点分配ID,但此解决方案涉及在其他节点上异步创建对象,我想删除这些对象。特别是因为应用程序是实时的,所以RDBMS是不可能的

我知道这是一个相当经典的分布式计算问题,但我可能缺乏适当搜索的词汇表


TCP是我唯一可以使用的协议,网络会受到延迟的影响。如果它是重要的,我在C++中工作,但是我在寻找一个算法,而不是一个库。

你可能喜欢使用s作为标识符,它们是唯一的设计,所以你不需要任何额外的算法支持。它们设计独特,因此您不需要任何额外的算法支持。

只需随机创建即可。对于128位的随机值,发生冲突的可能性非常小,您可以假定为零。在128位uuid空间上,冲突概率为2^64(生日悖论)

显然,您需要一个好的熵源,经典的
sha1(time(NULL))
是不可能的;)


更重要的是:如果节点随机选择其UUID,则绝对不需要创建UUID并将其提供给节点的中央协调器。每个节点自己创建自己的UUID

只需随机创建即可。对于128位的随机值,发生冲突的可能性非常小,您可以假定为零。在128位uuid空间上,冲突概率为2^64(生日悖论)

显然,您需要一个好的熵源,经典的
sha1(time(NULL))
是不可能的;)


更重要的是:如果节点随机选择其UUID,则绝对不需要创建UUID并将其提供给节点的中央协调器。每个节点自己创建自己的UUID

您可以让主节点一次为每个节点分配一个块或一系列ID,而不是一次分配一个ID。然后,每个节点根据需要从该块中分配ID

当一个节点的ID变低时,它会向主节点请求另一个块。通过这种方式,节点可以异步创建对象,并且仍然保证具有唯一的ID

我假设当对象被删除时,ID会返回到池中以供重用

如果您不想让主节点负责分发ID,另一种选择是使用以太网MAC地址或附加计数器的IP地址来组成ID。这要求网络上不显示重复的IP或MAC地址。此ID将大于16位


但是,如果所有节点都在同一网络上,例如IP地址AA.BB.CC.DD,则可以使用DD作为前8位,然后使用下8位作为计数器。这将仅为每个节点提供256个ID,这可能不够。如果子网较小,则计数器的可用位明显增加,这可能足以解决问题。

与主节点一次分配一个ID不同,您可以让它一次为每个节点分配一个块或一系列ID。然后,每个节点根据需要从该块中分配ID

当一个节点的ID变低时,它会向主节点请求另一个块。通过这种方式,节点可以异步创建对象,并且仍然保证具有唯一的ID

我假设当对象被删除时,ID会返回到池中以供重用

如果您不想让主节点负责分发ID,另一种选择是使用以太网MAC地址或附加计数器的IP地址来组成ID。这要求网络上不显示重复的IP或MAC地址。此ID将大于16位


但是,如果所有节点都在同一网络上,例如IP地址AA.BB.CC.DD,则可以使用DD作为前8位,然后使用下8位作为计数器。这将仅为每个节点提供256个ID,这可能不够。如果子网较小,则计数器的可用位明显增加,这可能足以解决问题。

这可能有效,但我担心大小开销。在当前的实现中,我的标识符适合16位。与您使用的标识符相比,它将增加8倍。这可能有效,但我担心大小开销。在当前的实现中,我的标识符适合16位。与您使用的标识符相比,它将增加8倍。我喜欢这个想法,但这让熵在对象的重新分区上承担了太多的责任。在我的应用程序中,一个节点可能负责创建所有对象,或者每个节点可能创建一个对象。也许调整标识符的大小就是诀窍(到32位左右)。说得好。我不知道为什么我认为对象创建会均匀地分布在节点上。使用32位可能会允许使用高阶位作为硬件序列号或节点特有的东西,其余的位可能是日期+时间或持久计数器。我喜欢这个想法,但这会在对象的重新分区上增加太多关于熵的责任。在我的应用程序中,一个节点可能负责创建所有对象,或者每个节点可能创建一个对象。也许调整标识符的大小就是诀窍(到32位左右)。说得好。我不知道为什么我认为对象创建会均匀地分布在节点上。转到32位可能允许使用硬件序列号的高阶位或节点特有的某些位,其余的位可能是日期+时间或持久计数器。