我需要在分布式数据库中每行生成和存储一个标识符(高写入吞吐量)。Id 的长度有限制,希望它尽可能小。ID 必须是 utf8。
我正在考虑生成一个 uuidv4,转换为 base16 编码,删除连字符并获取部分字符子集,将来如果我们需要更多字符,我们会获取更大的部分子集。
例如 Uuid = 123e4567-e89b-12d3-a456-426655440000
子集 = 123e4567e89b
这有可预见的问题吗?
我需要在分布式数据库中每行生成和存储一个标识符(高写入吞吐量)。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 编码。