可以为实体生成8字节的唯一ID

时间:2019-04-16 12:19:30

标签: c++ c uuid uniqueidentifier uid

我需要一个唯一的标识符来区分实体,但是实际上这些实体没有很多,当实体被销毁时,uid可以重复。实体是在分布式系统中创建的,可以同时创建多次。

当前使用流行的UUID库,但是UUID是128位数字。根据我系统的设计,一个int类型已经足够了。如果uid可以回收,则8字节应该可以。所以我认为有很多优化空间。

例如:

bool isEqual(const char *uid1, const char *uid2) {
    return strcmp(uid1, uid2) == 0;
}

如果我可以使uid成为整数而不是字符串,那么我就不需要使用字符串比较功能。

bool isEqual(int uid1, int uid2) {
    return uid1 == uid2;
}

但是我现在不知道有满足我需求的成熟库。

所以我想问你:

  • 如果我自己实施它,如何可行?
  • 我会遇到什么困难?
  • 我应该注意什么?
  • 有没有已经实现类似功能的库?
  • 值得吗?

顺便说一句,我可以使用C / C ++ / lua。

2 个答案:

答案 0 :(得分:1)

如果要在完全受控的分布式系统上自定义专用uid生成,则有3种可能性:

  1. 中央系统仅生成串行值,而其他系统则要求每个新uid。简单而完全确定,但生成器是单点故障
  2. 每个(逻辑)系统接收一个ID,并将其与本地序列号组合。例如,如果系统数量超过32000,则可以将16位用于系统ID,将48位用于串行。完全确定性,但需要管理员为每个系统提供其ID
  3. 随机。符合加密要求的高质量随机数生成器应为您提供具有低冲突概率的伪uid。但这只是概率性的,因此仍然有可能发生碰撞。
  

要注意的地方:

  • 比赛条件。如果一个生成器的客户端可以有多个进程,则必须确保uid生成正确同步
  • uid回收。如果整个系统的寿命必须足以耗尽串行发生器,那么您将必须在某处保留尚存实体及其uid的列表
  • 对于概率解决方案,碰撞的风险与同时实体的最大数量成正比。您应该仔细评估该可能性,并评估该风险是否可以接受。
  

这样的解决方案是否已经实施?

是的,在允许自动生成ID的数据库系统中。

  

值得吗?

只有你可以说...

答案 1 :(得分:0)

我们有一个很小的,安全的,唯一的Python字符串ID生成器,它可以减少ID的长度(但增加冲突的可能性),您可以将长度作为参数传递。要在python env中使用:

pip install nanoid

from nanoid import generate

generate(size=10) => u'p1yS9T21Bf'

要检查ID的生成方式及其在给定长度下的碰撞概率,请访问https://zelark.github.io/nano-id-cc/

引用:https://pypi.org/project/nanoid/