javascript - 生成具有易于区分的类型/组的实体 ID

标签 javascript python postgresql redis uniqueidentifier

我需要在分布式环境中生成唯一的 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/

相关文章:

MacOS 上的 MySQL 到 PostgreSQL 迁移

javascript - Modernizr 异步加载问题

JavaScript - 单击列表项时带有文本的弹出窗口

postgresql - 从 PostgreSQL 中的文本字段获取 ascii 字节

python - AttributeError : 'Tensor' object has no attribute 'lower' when applying Global MaxPooling instead of GlobalAveragePooling [duplicate]

python - 如何设置y轴限制

postgresql - 当一行有一个外键到另一行时,如何原子地写入两行?

javascript - 合并对象数组中的重复对象

javascript - 如何在 ASP.NET MVC 应用程序中进行 AJAX GET 调用

python - Matplotlib:如何获得颜色图的反函数?