使用填充的 0 进行整数到 UUID 的转换

Integer to UUID conversion using padded 0's

我有一个关于 UUID 生成的问题。

通常,当我生成 UUID 时,我会使用随机或基于时间的生成方法。

但是,我正在将遗留数据从 MySQL 迁移到 C* 数据存储,我需要将遗留(自动递增)整数 ID 更改为 UUIDS。我没有创建另一个以遗留整数 ID 作为主键并复制所有数据的非规范化 table,而是想知道人们如何考虑将 0 填充到整数 ID 的前面以形成 UUID。示例如下。

*需要注意的重要一点是,旧版 ID 的最高值永远不会超过 100 万,因此溢出并不是真正的问题。

这个想法看起来像这样:

旧版 ID:123456 ---> UUID:00000000-0000-0000-0000-000000123456

这将使用一些字符串连接和 UUID.fromString("00000000-0000-0000-0000-000000123456" 方法来完成。

这对任何人来说都是一种糟糕的模式吗?我不是这个想法的忠实粉丝,让我觉得不好,但我没有技术原因哈哈。

就碰撞而言,发生碰撞的概率仍然低得离谱。所以我不担心碰撞会增加。我想这对我来说似乎是不好的做法,它 "too easy".

我们之前从具有序列生成的 ID 的 Oracle 迁移到具有生成的 UUID 的 Cassandra 时遇到过同样的问题。

我们必须设计一种类型,以支持来自 Oracle 的类型为 long 的旧数据和类型为 uuid 的新数据。

显而易见的解决方案是使用类型blob 来存储id。 blob 可以编码 longuuid.

此解决方案仅适用于分区键,因为您使用 = 查询它们。它不适用于使用 >< 等运算符的聚类列,因为我们需要对它们的值进行排序。

当时有一个小反对意见,即使用 blob 来存储 id 使其对用户不透明,例如在 cqlsh 中当你'正在做一个 SELECT 并且你需要提供 id,你将如何制作一个 blob?

幸运的是,CQL bigIntAsBlob()blobAsBigInt()uuidAsBlob()blobAsUUID() 的原生函数非常方便。

我决定采用与 doanduyhai 的回答不同的方向。

为了保持数据的一致性,我们决定完全去规范化数据并在 C* 中创建另一个 table,它以我们的遗留 ID 为键。将对象从我们的旧版迁移到 C* 时,会为它们分配一个新的随机生成的 UUID,这将是它们未来的新主 ID。遗留 ID 将一直保留到我们决定不再需要它们为止。到那时,我们就可以彻底删除遗留 ID table 并完成它们。

此解决方案允许我们在未来更彻底地脱离我们的遗留 ID 系统,并允许我们防止使用奇怪的自定义 UUID。我也不喜欢将 ID 字段作为可以存储多种类型数据的 blob 类型,因为在未来,我们计划只希望 UUID 在那里。