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



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

  1. 中央系统只生成串行值,其他系统则要求每个新 uid 。简单且完全确定,但生成器是单点故障
  2. 每个(逻辑)系统接收一个 ID 并将其与本地序列号组合在一起。例如,如果系统数量超过 32000,则可以使用 16 位作为系统 ID,使用 48 位作为串行。完全确定,但需要管理员为每个系统提供其 ID
  3. 随机。符合加密要求的高质量随机数生成器应该为您提供冲突概率低的伪 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/

相关内容

  • 没有找到相关文章

最新更新