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

问题描述 投票:1回答:2

我需要一个唯一的标识符来区分实体,但实际上这些实体没有很多,并且当实体被销毁时可以重复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。

c++ c uuid uniqueidentifier uid
2个回答
1
投票

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

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

要注意:

  • 竞争条件。如果多个进程可以是生成器的客户端,则必须确保正确同步uid生成
  • 回收利用。如果整个系统的设计必须足够长,以便耗尽串行发生器,那么你必须保留一些仍然存在的实体列表和它们的uid
  • 对于概率解,碰撞风险与同时实体的最大数量成比例。您应该仔细评估该概率并评估是否可以接受风险。

这些解决方案是否已实施?

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

值得?

只有你可以说......


0
投票

我们为Python提供了一个小巧,安全,唯一的字符串ID生成器,它允许您减少ID长度(但增加了碰撞概率),您可以将长度作为参数传递。要在python环境中使用:

pip安装nanoid

from nanoid import generate

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

要查看ID的生成方式以及给定长度的碰撞概率,请访问qazxsw poi

参考:https://zelark.github.io/nano-id-cc/

© www.soinside.com 2019 - 2024. All rights reserved.