我的 23 个明确字符是:
c,d,e,f,h,j,k,m,n,p,r,t,v,w,x,y,2,3,4,5,6,8,9
我需要一组明确的字符供用户输入,而且我找不到其他人已经生成了符合我标准的字符集和规则集的任何地方。
我的要求:
没有大写字母:这应该在 URI 中使用,并且由可能没有很多打字经验的人输入,对于他们来说,即使是 shift 键也会减慢他们的速度并导致不确定性。我也希望有人能够说“全小写”以减少不确定性,所以我想避免大写字母。
很少或没有元音:避免产生粗话或令人惊讶的词的简单方法是简单地省略大多数元音。我认为保留“e”和“y”是可以的。
始终如一地解决歧义:我愿意使用一些歧义字符,只要我只使用每组中的一个字符(例如,在小写 s、大写 S 和五个中,我可能只使用五个);这样,在后端,我可以用他们组中的一个正确字符替换这些模棱两可的字符中的任何一个。因此,在我在我的数据库中查找它的匹配项之前,输入字符串“3Sh”将被替换为“35h”。
只需要创建标记:我不需要像 base64 或 base32 那样对信息进行编码,所以我的集合中的确切字符数并不重要,除了我希望尽可能大。它只需要对生成随机 UUID 类型的 id 令牌有用。
强烈偏爱非歧义性:我认为与某人必须输入更长的令牌相比,输入令牌并出现问题的成本要高得多。当然,有一个权衡,但我更喜欢简洁而不是模糊。
我确定的易混淆的字符组:
- A/4
- b/6/G
- 8/B
- 转/转
- 女/女
- 9/g/q
- i/I/1/l/7 - 太模糊而无法使用;请注意,欧洲的“1”可能看起来很像许多人的“7”
- k/K
- o/O/0 - 太模糊而无法使用
- 纸币/纸币
- 秒/秒/5
- v/V
- 带W/W
- X/X
- 是/是
- z/Z/2
明确的字符:
我认为这只剩下 9 个完全明确的小写/数字字符,没有元音:
d,e,h,j,m,n,r,t,3
从每个模棱两可的组中添加一个字符(并尝试更喜欢看起来最明显的字符,同时避免大写),有 23 个字符:
c,d,e,f,h,j,k,m,n,p,r,t,v,w,x,y,2,3,4,5,6,8,9
分析:
使用经验法则,即具有 N 种可能性的数值等效范围的 UUID 足以避免 sqrt(N) 实例的冲突:
- 使用此字符集的 8 位 UUID 应该足以避免大约 300,000 个实例的冲突
- 使用此字符集的 16 位 UUID 应该足以避免大约 800 亿个实例的冲突。