【问题标题】:cutdown uuid further to make short string进一步减少 uuid 以制作短字符串
【发布时间】:2010-11-21 02:01:39
【问题描述】:

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

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

但我们觉得这很冗长。

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

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

任何语言的任何想法或示例都可以

提前致谢

【问题讨论】:

    标签: c# python string uniqueidentifier uuid


    【解决方案1】:

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

    【讨论】:

    • 一个 UUID 也是 16 个字节,所以这并没有让它变小。
    • Glenn,uniqueindentifier==UUID,但 OP 肯定是在谈论将其存储为字符串。
    【解决方案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 个字符长

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 取决于他需要多少独特性。这就是我建议 CRC 和替代方案的原因。
        • 不幸的是,您不能在不取消其作为 UUID 的状态的情况下削减 UUID 的原始位。这是因为需要有 128 位随机性才能被视为 UUID,并充分将冲突的可能性降低到接近于零。
        • 他不需要它是 UUID。他需要它是(本地)唯一的一组位。
        【解决方案5】:

        为什么不直接将其转换为 base 64 字符串呢?你可以这样减少到 22 个字符。

        Storing UUID as base64 String

        【讨论】:

          猜你喜欢
          • 2021-03-05
          • 1970-01-01
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 2020-04-18
          • 2015-02-10
          • 2017-01-01
          • 1970-01-01
          相关资源
          最近更新 更多