【问题标题】:Convert a GUID to a shorter string using 36 character alphabet 0-9 and A-Z使用 36 个字符的字母 0-9 和 A-Z 将 GUID 转换为较短的字符串
【发布时间】:2011-06-11 01:16:37
【问题描述】:

我有一个应用程序,我使用打印的二维码通过数据库记录识别现实生活中的对象。

数据库使用 GUID 作为主键(这是不可协商的,因为它是一个偶尔连接的系统)。

为了使二维码尽可能小,我尝试将我的 32 个字符的十六进制 GUID 转换为更短的字符串,该字符串利用字母数字二维码中可用的 36 个字符字母(0-9 和 AZ)。

整个基本转换都超出了我的想象,因此非常感谢任何帮助。

【问题讨论】:

    标签: guid hex base


    【解决方案1】:

    您可以将 GUID 存储为字节数组并将其转换为 Base32

    另见related question

    【讨论】:

    • 他想让字符串变短。这些链接中讨论的方法使字符串更长。
    • @Oscar:您不需要将 GUID 处理为字符串,您可以将 is 视为字节序列,因此它是 16 个字节,然后将其转换为 Base32 并且仍然具有比您少的字符会有十六进制表示。
    【解决方案2】:

    我会将其转换为比 Base32 小 20% 的 Base64。转换为 base64 的库或示例代码很容易获得。 base64 的唯一问题显然是字母 'a' 和 'A' 根据 base64 不同但不一定与您的数据库不同,因此如果您选择 Base64 而不是 Base32,那么您必须检查您的数据库表排序规则是正确设置。

    【讨论】:

    • Base64 似乎是一个非常简单的转换(因为微软已经把它放在 Convert 类中),不幸的是,我被只覆盖字符 0-9 和 A-Z 的二维码字母表困住了。谢谢
    【解决方案3】:

    全局唯一标识符 (GUID) 的值可以表示为 32 个字符的十六进制字符串,但通常存储为 128 位(16 字节)整数。

    我怀疑可以存储这种 128 位值的最小可能 QR 码是指定“二进制/字节编码”(可以存储任何 8 位字节) 并直接存储 16 个字节。 它以每比特 1 个像素、每字节 8 个像素(加上标准开销比特)进行编码。 我很确定所有其他有效的 QR 编码将使用至少每比特 1 个像素并具有相同的标准开销。 因此,您不会通过任何类型的 Base64 或 Base45 或 Base36 或 Base32 转换获得更小的 QR 码。

    我见过的大多数编码 URL 的二维码都使用相同的“二进制/字节编码”来支持小写字母。 在我的经验中,使用“字母数字编码”的 QR 码不太常见——当用于对 URL 进行编码时,它们会解码为全大写 URL(因为它们只能存储 0-9、A-Z 的 45 个符号 [仅大写]、空格、$、%、*、+、-、.、/、:)。 “每 2 个字符 11 位”在许多情况下非常聪明,但在编码 GUID 时并没有真正的帮助。

    你见过http://www.younoodle.com/startups/barcode_guidWikipedia:spime吗?

    【讨论】:

      【解决方案4】:

      将 GUID 作为 16 字节整数存储在 QR 码中是获取小 QR 码的最佳方式,如果您发现它在物理上仍然太大,请考虑渲染 微型 QR 码。 [https://www.qrcode.com/en/codes/microqr.html] (无法进一步压缩二维码,因为它们已经接近最大熵)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2019-11-22
        • 1970-01-01
        相关资源
        最近更新 更多