我需要一个唯一的标识符来区分实体,但实际上这些实体并没有很多,当实体被销毁时,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。
如果你想在完全控制的分布式系统上生成自定义的专用 uid,你有 3 种可能性:
- 中央系统只生成串行值,其他系统则要求每个新 uid 。简单且完全确定,但生成器是单点故障
- 每个(逻辑)系统接收一个 ID 并将其与本地序列号组合在一起。例如,如果系统数量超过 32000,则可以使用 16 位作为系统 ID,使用 48 位作为串行。完全确定,但需要管理员为每个系统提供其 ID
- 随机。符合加密要求的高质量随机数生成器应该为您提供冲突概率低的伪 uid。但这只是概率性的,所以碰撞仍然是可能的。
注意事项:
- 比赛条件。如果一个生成器的客户端可以有多个进程,则必须确保正确同步 uid 生成
- UID 回收。如果整个系统必须设计为足够长的寿命以耗尽串行发电机,则必须在某个地方保留仍然存在的实体及其 uid 的列表
- 对于概率解,冲突风险与并发实体的最大数量成正比。您应该仔细评估该概率并评估是否可以接受风险。
这样的解决方案是否已经实施?
是的,在允许自动生成 ID 的数据库系统中。
值得吗?
只有你能说...
我们为 Python 提供了一个微小、安全、唯一的字符串 ID 生成器,它允许你减少 ID 长度(但增加冲突概率),你可以将长度作为参数传递。要在python env中使用:
点安装纳米
from nanoid import generate
generate(size=10) => u'p1yS9T21Bf'
要检查 ID 是如何生成的,请在给定长度内访问 https://zelark.github.io/nano-id-cc/
参考: https://pypi.org/project/nanoid/