9

我需要为给定的唯一字符串生成唯一记录 ID。

我尝试使用似乎不错的 uuid 格式。

但我们觉得那是冗长的。

所以我们需要将 uuid 字符串 9f218a38-12cd-5942-b877-80adc0589315 缩减为更小。通过删除 '-' 我们可以节省 4 个字符。从 uuid 中删除最安全的部分是什么?我们不需要普遍唯一的 id,但我们喜欢使用 uuid 作为来源,但会减少字符串。

我们需要特定于站点/数据库(SQL Server/ADO.NET 数据服务)的唯一 ID。

任何语言的任何想法或样本都可以

提前致谢

4

5 回答 5

9

为什么不直接将其转换为 base 64 字符串?您可以通过这种方式将其减少到 22 个字符。

将 UUID 存储为 base64 字符串

于 2009-08-19T19:17:50.963 回答
3

如果您使用的是 MS-SQL,您可能应该只使用 uniqueindentifier 数据类型,它既紧凑(16 字节)又因为 SQL 引擎知道它可以使用它优化索引和查询。

于 2009-08-19T19:29:14.950 回答
2

UUID 是 128 位或 16 字节。如果没有编码,您可以得到低至 16 字节的数据。UUID 通常以十六进制编写,使其成为 32 字节的可读字符串。使用其他编码,您会得到不同的结果:

  1. base-64 将 3 个 8 位字节转换为 4 个 6 位字符,因此 16 个字节的数据变成 22 个字符长
  2. base-85 将 4 个 8 位字节变成 5 个 6.4 位字符,因此 16 个字节的数据变成 20 个字符长

这完全取决于您是否想要可读的字符串以及您想要使用的编码的标准/通用程度。

于 2009-08-19T21:17:05.700 回答
2

UUID 提供(几乎)128 位的唯一性。您可以将其缩短为 16 个二进制字节,或 22 个 base64 编码字符。我不建议删除 UUID 的任何部分,否则,它就会失去意义。UUID 的设计使所有 128 位都有意义。如果你想要的更少,你应该使用其他一些模式。

例如,如果您可以保证只使用第 4 版 UUID,那么您可以只使用前 32 位,或者只使用后 32 位。你失去了唯一性,但你有相当随机的数字。只需避免固定的位(版本和变体)。

但如果你不能保证,你就会遇到真正的问题。对于版本 1 的 UUID,同一天生成的 UUID 的第一位不会唯一,同一系统中生成的 UUID 的最后一位也不会唯一。即使您对 UUID 进行 CRC 校验,也不能保证您将拥有 16 位或 32 位的唯一性。

在这种情况下,只需使用其他方案。使用系统随机数生成器生成一个 32 位随机数,并将其用作您的唯一 ID。如果您打算剥离它的长度,请不要依赖 UUID。

于 2009-08-19T20:44:20.807 回答
0

UUID 有 128 位。您是否考虑过对其进行CRC?这可以轻松地将其降低到 16 或 32 位,并使用所有原始信息。如果 CRC 不够好,您始终可以使用正确散列的前几个字节(例如 SHA256)。

如果你真的只想减少 UUID,它的格式在RFC 4122中有描述。您应该能够从中找出您的实现不需要哪些部分。

于 2009-08-19T19:30:13.810 回答