可区分的字符?

4 投票
4 回答
925 浏览
提问于 2025-04-16 00:14

我在数据库里有一堆物品,每个物品都有一个独特的ID。我想把这个ID缩短一下,然后在页面上显示出来,这样如果用户需要打电话联系我们关于某个特定的物品时,他可以告诉我们这个缩短的ID,而不是一个很长的数字。就像一些网站上的SKU一样,比如NCIX。所以,我在考虑用36进制来编码这个ID。不过,这样做有个问题,就是像1lI这些字符看起来都差不多。我在想要不要把这些看起来相似的字符去掉。这样做是个好主意吗,还是说我应该用一种更容易辨认的字体呢?

4 个回答

1

使用易读的字体。

3

我假设原始的ID是数字类型的。我们在类似的情况下使用z-base-32取得了不错的效果。我们从2009年4月开始使用它。

我特别喜欢这种编码的目标,就是减少抄写错误,通过去掉一些容易混淆的字母来实现,同时也追求简洁,因为短一些的标识符更容易使用。

这种编码对字母的顺序进行了调整,让那些更常用的字符更容易阅读、书写、发音和记忆。使用小写字母是因为这样更容易阅读。

在我们决定使用z-base-32之前,我曾问过这个类似的问题

6

没错,你应该消除那些让人困惑的地方。因为如果有可能出错,肯定会有人犯错。比如,数字0和字母O,字母I和小写字母l或数字1,很容易搞混,所以最好不要同时使用它们。其实这很简单——只要不使用这三个字符(i、L和o),你就可以用36进制减去3,得到33,然后进行转换。

SKU.replace('I','X').replace('L','Y').replace('O','Z')

反过来说,当你拿到这样的代码,并准备执行int(SKU, 33)之前,你需要把XYZ这些字符换回那些让人困惑的字符。不过在这之前,如果你意外地得到了L或I,就把它们替换成1;如果得到了O,就把它替换成0。例如,可以使用SKU.translate(),配合 string.maketrans('LIOXYZ','110IL0')来实现。

撰写回答