部分 uuid 是个好主意吗?

Partial uuids a good idea?

我需要在分布式数据库中每行生成并存储一个标识符(高写入吞吐量)。 Id 的长度有限制,希望它尽可能小。 id 必须是 utf8.

我正在考虑生成一个 uuidv4,转换为 base16 编码,删除连字符并获取字符的部分子集,将来如果我们需要更多字符,我们会获取更大的部分子集。

例如 Uuid = 123e4567-e89b-12d3-a456-426655440000

子集 = 123e4567e89b

是否存在可预见的问题?

您不能保证部分 UUID 的普遍唯一。现在,根据生成的 UUID 的数量,这可能不是问题 - 特别是如果您检查重复项......但也许最好只编写您自己的具有所需长度规范的 ID 生成器。我想 UUID 的实际规范需要一定数量的位,每个位都被认为是普遍唯一的,但您的要求限制了 length。它们不需要使用实际的 UUID。

如果您的字段必须是文本并且长度很重要,那么使用 base16 只能为您提供每个字节 4 位,而 base64 为每个字节提供 6 位。换句话说,前者需要多 50% 的字节才能达到与后者相同的冲突概率。通过利用 UTF-8 的工作原理,您可以达到每字节约 7 位,但这需要更多的工作(和风险)才能获得更少的收益。

不过,使用截断的 UUID 没有意义;你必须使用整个东西,否则它的防碰撞特性不成立。如果你只是想要一个随机字符串,特别是当你有能力检查冲突时,只需生成一个具有所需位数(最好是 6 的倍数)的随机数,然后对其进行 base64 编码。