我的一组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和数字5中,我可能只使用数字5);这样,在后端,我可以将这些模糊的字符中的任何一个替换为其组中的一个正确字符。因此,输入字符串“3Sh”将在我查找其数据库匹配项之前被替换为“35h”。
仅用于创建令牌:我不需要像base64或base32那样编码信息,因此除了我希望尽可能大之外,我的字符集中的确切字符数并不重要。它只需要用于生成随机UUID类型的ID令牌。
强烈偏好非模糊性:我认为让某人输入令牌并出现错误比让某人输入更长的令牌成本更高。当然有权衡,但我想强烈偏好非模糊性而不是简洁性。
我确定的混淆字符组:
- A/4
- b/6/G
- 8/B
- c/C
- f/F
- 9/g/q
- i/I/1/l/7 - 太容易引起歧义了;请注意,欧洲“1”看起来很像许多人的“7”
- k/K
- o/O/0 - 太容易引起歧义了
- p/P
- s/S/5
- v/V
- w/W
- x/X
- y/Y
- 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
分析:
使用经验法则,UUID具有数值等价范围N,足以避免sqrt(N)实例的冲突:
- 使用此字符集的8位UUID应足以避免约300,000个实例的冲突
- 使用此字符集的16位UUID应足以避免约800亿个实例的冲突。