可以为实体生成 8 字节的唯一 ID
Possible to generate 8-byte Unique ID for an entity
我需要一个唯一标识符来区分实体,但实际上这些实体并不多,实体销毁时uid可以重复。实体是在分布式系统中创建的,可以同时创建多次。
目前正在使用一个流行的UUID库,但是UUID是一个128位的数字。按照我的系统设计,一个int类型就绰绰有余了。如果uid可以回收,8字节应该可以。所以我觉得有很多优化space.
例如:
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.
我们为 Python 提供了一个小巧、安全、唯一的字符串 ID 生成器,它允许您减少 ID 长度(但增加冲突概率),您可以将长度作为参数传递。在 python 环境中使用:
pip 安装 nanoid
from nanoid import generate
generate(size=10) => u'p1yS9T21Bf'
要检查 ID 的生成方式及其给定长度的冲突概率,请访问 https://zelark.github.io/nano-id-cc/
如果您想在完全受控的分布式系统上生成自定义专用 uid,您有 3 种可能性:
- 一个中央系统只生成序列值,其他系统向它询问每个新的 uid。简单且完全确定性,但生成器是单点故障
- 每个(逻辑)系统接收一个id并将其与本地序列号组合。例如,如果系统数量超过 32000,您可以使用 16 位的系统 ID 和 48 位的序列号。完全确定性但需要管理员为每个系统提供其 id
- 随机。符合加密要求的高质量随机数生成器应该为您提供具有低冲突概率的伪 uid。但这只是概率,所以仍然有可能发生碰撞。
Point to pay attention to:
- 竞争条件。如果多个进程可以作为生成器的客户端,则必须确保 uid 生成正确同步
- uid回收。如果整个系统必须设计成足够长的寿命以耗尽串行生成器,则您将必须在某处保留仍然存在的实体及其 uid
的列表
- 对于概率解决方案,碰撞风险与同时存在的实体的最大数量成正比。您应该仔细评估那个概率并评估风险是否可以接受。
Are such solutions already implemented?
是,在允许自动生成 ID 的数据库系统中。
Worth it?
只有你能说...
我需要一个唯一标识符来区分实体,但实际上这些实体并不多,实体销毁时uid可以重复。实体是在分布式系统中创建的,可以同时创建多次。
目前正在使用一个流行的UUID库,但是UUID是一个128位的数字。按照我的系统设计,一个int类型就绰绰有余了。如果uid可以回收,8字节应该可以。所以我觉得有很多优化space.
例如:
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.
我们为 Python 提供了一个小巧、安全、唯一的字符串 ID 生成器,它允许您减少 ID 长度(但增加冲突概率),您可以将长度作为参数传递。在 python 环境中使用:
pip 安装 nanoid
from nanoid import generate
generate(size=10) => u'p1yS9T21Bf'
要检查 ID 的生成方式及其给定长度的冲突概率,请访问 https://zelark.github.io/nano-id-cc/
如果您想在完全受控的分布式系统上生成自定义专用 uid,您有 3 种可能性:
- 一个中央系统只生成序列值,其他系统向它询问每个新的 uid。简单且完全确定性,但生成器是单点故障
- 每个(逻辑)系统接收一个id并将其与本地序列号组合。例如,如果系统数量超过 32000,您可以使用 16 位的系统 ID 和 48 位的序列号。完全确定性但需要管理员为每个系统提供其 id
- 随机。符合加密要求的高质量随机数生成器应该为您提供具有低冲突概率的伪 uid。但这只是概率,所以仍然有可能发生碰撞。
Point to pay attention to:
- 竞争条件。如果多个进程可以作为生成器的客户端,则必须确保 uid 生成正确同步
- uid回收。如果整个系统必须设计成足够长的寿命以耗尽串行生成器,则您将必须在某处保留仍然存在的实体及其 uid 的列表
- 对于概率解决方案,碰撞风险与同时存在的实体的最大数量成正比。您应该仔细评估那个概率并评估风险是否可以接受。
Are such solutions already implemented?
是,在允许自动生成 ID 的数据库系统中。
Worth it?
只有你能说...