【问题标题】:Using Crockford's base 32 for IDs in URLs?在 URL 中使用 Crockford 的 base 32 作为 ID?
【发布时间】:2011-12-21 23:15:44
【问题描述】:

我想写一些 ID 用于Crockford's base32 中的 URL。我正在使用base32 npm module

因此,例如,如果用户输入 http://domain/page/4A2A,我希望它映射到与 http://domain/page/4a2a 相同的底层 ID

这是因为我想要人性化的 URL,用户不必担心大小写字母之间的区别,或者“l”和“1”之间的区别——他们只需要得到他们想要的页面预计。

但我很难实现这一点,主要是因为我太模糊了,无法理解编码的工作原理。首先我尝试了:

var encoded1 = base32.encode('4a2a');
var encoded2 = base32.encode('4A2A');
console.log(encoded1, encoded2);

但它们映射到不同的底层 ID:

6hgk4r8 6h0k4g8

好的,所以也许我需要使用解码?

var encoded1 = base32.decode('4a2a');
var encoded2 = base32.decode('4A2A');
console.log(encoded1, encoded2);

不,这只是给我空字符串:

"    " 

我做错了什么,如何让 4A2A 和 4A2A 映射到同一事物?

【问题讨论】:

  • 如果您尝试在6hgk4r8 上使用解码会发生什么?那样有用吗?您确定 4a2a 是该库的有效 base-32 编码吗?
  • 是的,确实有效。我想也许你是对的,4a2a 不是有效的 base-32 编码......但为什么不呢?
  • 好吧,当我在这里运行它时,4a2a 实际上返回输出,一个引号和控制字符 0x84。所以我不确定你从哪里得到 4a2a,但如果它应该返回文本(而不是数字),它使用不同的 base-32。

标签: javascript url encoding base32


【解决方案1】:

您感到困惑的根源在于 base64 或 base32 是表示数字的方法,而您在示例中尝试对文本字符串进行编码或解码。

将文本字符串编码和解码为 base32 是通过首先将字符串转换为一个大数字来完成的。在您的第一个示例中,您正在编码“4a2a”和“4A2A”,它们是具有两个不同数值的字符串,因此转换为具有两个不同值的编码 base32 数字,6hgk4r8 6h0k4g8

当您“解码” 4a2a 和 4A2A 时,您会说您得到的是空字符串。然而这不是真的,字符串不是空的,当解释为字符串时,它们包含解码后的数字。也就是说,它看起来什么都没有,因为 4a2a 产生了一个不可打印的字符。它是看不见的。您想要的是提供编码器编号,而不是字符串。

【讨论】:

    【解决方案2】:

    JavaScript 有

    parseInt(num, 32)

    num.toString(32)

    以与 Java 和跨 JavaScript 版本兼容的方式内置。

    【讨论】:

      【解决方案3】:

      对于传入的请求,您需要解码 URL 片段。当您创建 URL 时,您将获取您的标识符并对其进行编码。因此,给定 URL http://domain/page/dnwnyub46m50,您将获取该片段并对其进行解码。示例:

      #> echo 'dnwnyub46m50'| base32 -d

      my_id5

      您链接到的库不区分大小写,因此您可以通过这种方式获得相同的结果:

      echo 'DNWNYUB46M50'| base32 -d

      my_id5

      在处理任何编码方案(Base-16/32/64)时,您有两个基本操作:encode,它适用于比特/字节的原始流,以及 decode,它采用一组编码的字节并返回原始位/字节流。 Base32 编码的Wikipedia page 是一个很好的资源。

      解码字符串时,您会得到原始字节:这些字节可能与ASCIIUTF-8 或您尝试使用的其他编码不兼容。这就是为什么您的解码示例看起来像空格:您使用的工具无法将生成的字节识别为有效字符。

      如何对标识符进行编码取决于标识符的生成方式。你没有说你是如何生成底层标识符的,所以我不能对你应该如何处理来自解码器的原始字节做出任何假设,也不能对传递给编码器的原始字节的内容做出任何假设。

      同样重要的是要提到您链接到的库与 Crockford 的 Base32 编码不兼容。该库不包括I, L, O, S,而Crockford 的编码不包括I, L, O, U。如果您尝试与使用不同库的另一个系统进行互操作,这将是一个问题。如果除了您之外没有人需要解码您的 URL 片段,那么互操作性就无关紧要了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-08
        • 2016-12-15
        • 2013-06-07
        • 2015-04-09
        • 2012-09-03
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        相关资源
        最近更新 更多