我需要在分布式环境中生成唯一的 ID。 Catch 是每个 id 都必须有一个可以通过简单脚本检查的组/类型信息。
详细信息: 我有一些固定数量的实体类型(我们称它们为:消息、资源、用户、 session 等)。我需要生成唯一的 id 形式:这样我就可以知道只根据 id 将请求定向到哪里——没有数据库、列表或任何东西。
我考虑过版本 3 或 5 中的 uuid,但据我所知,不可能知道为生成 ID 提供的“ namespace ”。
我也考虑过用固定值替换 uuid 的前 x 个字符,但那样我会失去唯一性。
我也考虑过 Twitter snowflake 或 Instagram 生成 id 的方式,但我不知道每个组中的节点数量,因此我无法假设任何事情。
我将在 JS、Python、Redis 和 Postgresql 中使用它们,因此需要代码的可移植性(和表示 - 大整数表示在 JavaScript 中充满错误)。因此,可以将纯“数字”或字符串格式化为数据库的 uuid(二进制表示)。
编辑:
我将在 Python 或 Postgresql 中生成它们,并且只在 JavaScript 和 Redis 中传递它们。
最佳答案
UUID 版本 4 基本上是 122 个随机位 + 4 个用于 UUID 版本的位 + 2 个保留位。它的唯一性依赖于生成相同 122 位的低概率。
UUID 版本 5 基本上是 122 个哈希位 + 4 位用于 UUID 版本 + 2 位保留位。它的独特性依赖于 122 位 chop SHA1 哈希的低冲突概率。
当您替换 UUID 的 N 位(只要它们不是“版本”或“保留”位)时,您会做出权衡:冲突的概率会提高 2^N 倍。
例如,如果使用UUID4,碰撞概率可以忽略不计,即2^122。同时,如果您有最多 8 个实体类型并使用替换了 8 位的 UUID4,则碰撞概率变为 2^194,更大,但仍然可以忽略不计。
因此,使用替换了 N 位的 UUID4 可能是一个安全的选择,无需特别注意保证唯一性。
关于javascript - 生成具有易于区分的类型/组的实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21730906/