【问题标题】:Creating the shortest possible case-insensitive verification number创建最短的不区分大小写的验证号
【发布时间】:2009-08-18 22:57:59
【问题描述】:

这会有点冗长而杂乱无章,但我想确保一切都在正确的上下文中。

早在 2004 年,我就使用 Classic ASP 和 VBScript 编写了一个在线学习管理系统。我现在正在进行一些升级(并定期问自己 WTF 我在编写各种代码段时的想法......),我想借此机会解决我经常收到的抱怨之一 - 的大小验证码。

当您在线完成测试时,会显示一个验证号,因此如果您需要重新创建结业证书(它是一家医院,并且试图让他们摆脱他们的论文就像要求 Linus 放弃一样)他的毯子)你可以输入号码等。

在我写这篇文章的时候(很遗憾,直到今天),我没有可以用来创建成绩单页面的唯一标识符 - 所以请不要为此发布建议。发生的事情比我想进入的要多,我想阻止我无法使用的有效建议。 ;)

验证码是各种信息的串联(主要是因为当我第一次编写它时,我是一个白痴新手,所以不在身边),虽然它是一个非常受欢迎的功能,但也有很多抱怨关于这个数字有多长。此时返回原始 ID 并不好,因为我们处于 6 位范围内。

我最初的想法是使用从其他地方获得的 Base64 编码算法,但考虑到我在数字方面遇到的问题,我认为将其更改为区分大小写的值只是要求使用不同类别的问题......这让我想到了手头的问题:

我可以使用什么来创建最短的不区分大小写的验证号,因为十六进制不会显着减少长度?

正如标签所示,我需要能够在 ASP Classic/VBScript 中实现它——此时迁移不是一个选项。

编辑:根据答案,我找到了 Crockfor 的 Base32 实现的链接,看起来就像我正在寻找的一样 - http://www.crockford.com/wrmg/base32.html

【问题讨论】:

    标签: web-applications asp-classic vbscript


    【解决方案1】:

    Base36?

    编辑:正如 Lucky 在 cmets 中提到的那样,在这种情况下,使用 Base36 可能不会比 Base32 带来任何真正的优势。

    【讨论】:

    • +1。但也要考虑基数 33,它通过不使用字母 I、L 和 O 来避免另一个可能的错误来源(但确实接受它们作为输入,O = 0,L = I = 1)。
    • @Todd:我最初的回答建议使用 Base32,但后来我重新阅读了这个问题,发现 OP 要求“最短”编码。
    • 一个 4 个字符的 base-32 可以表示任何 6 位数字,一个 3 位的 base-36 不能,所以在这个问题空间中“最短”可能是相同的。
    • 我将使用 Base32 选项。现在开始实施......我将把它留到一个新问题上。
    【解决方案2】:

    不区分大小写的字母和数字?我认为您需要一个基本 (26 + 10) 转换器...

    【讨论】:

      【解决方案3】:

      在证书中信息串联的二进制表示上使用Huffman Coding 怎么样?然后将结果作为十进制数返回。

      【讨论】:

      • 我真的很喜欢这个答案。我实际上不会这样做,我也不会推荐它,但它有一定的天赋。
      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多