使用填充的 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 可以编码 long
或 uuid
.
此解决方案仅适用于分区键,因为您使用 =
查询它们。它不适用于使用 >
或 <
等运算符的聚类列,因为我们需要对它们的值进行排序。
当时有一个小反对意见,即使用 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 在那里。
我有一个关于 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 可以编码 long
或 uuid
.
此解决方案仅适用于分区键,因为您使用 =
查询它们。它不适用于使用 >
或 <
等运算符的聚类列,因为我们需要对它们的值进行排序。
当时有一个小反对意见,即使用 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 在那里。