IDにおける視覚的に紛らわしい文字を理解する
- 視覚的に紛らわしい文字とは、特定のフォントや手書きで見分けにくい文字を指す
- O/0, I/l/1/7, 5/S, 2/Z, 8/B, 6/G, 9/q/g などが該当
- こうした文字は、データ入力時にエラーや混乱を引き起こす可能性がある
- ユーザーが
O と 0 を区別しにくく、誤ったコードを入力してしまうなど、不便なユーザー体験につながる
- IDが口頭で伝えられたり、手書きしなければならない場面では特に重要
- カスタマーサポート、割引コード、追跡コード、エラーID、製品ID など
大文字・小文字を区別するかどうかを決める
- IDで大文字・小文字を区別するかどうかを決める必要がある
- 区別する場合、視覚的な曖昧さを除外したうえで選択可能な文字は53個
- 区別しない場合、選択可能な文字は22個
- IDの長さが5文字の場合のID総数:
- 大文字・小文字を区別: 53^5 = 418,195,493通り
- 大文字・小文字を区別しない: 22^5 = 5,153,632通り
- ただし、IDの長さが増えるほど、生成可能なIDの数は指数関数的に増加する
- そのため、IDの長さと視覚的曖昧さの可能性のあいだで妥当な折衷点を見つける必要がある
- また、大文字・小文字の両方を使うと、大文字・小文字を区別しないサードパーティ製システムで予期しない問題が起こる可能性もある
視覚的に明確な文字セット
- 可読性を最優先するなら、次のような文字セットの利用を推奨:
- [ "a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "w", "x", "y", "3", "4"]
追加で考慮すべき点
- 特定の文字の組み合わせが別の文字に見えることがある(例: rn は m のように、3 は w のように見える)
- ID生成の段階でこうした組み合わせを避けるのが望ましい
- 発音が似ている文字も避けたほうがよい(例: b と p)
既存の事例
- Crockford's Base32: 紛らわしい文字を同じ値としてデコードし、偶発的な罵倒語も考慮している
- Open Location Code:
23456789CFGHJMPQRVWX の文字セットを使用。視覚的曖昧さの回避に加え、一般的な言語の単語が形成されることも避けようとしている。ただし 6/G、9/Q は含む。
GN⁺の見解
- ID生成では、使いやすさと可読性を最優先で考えるべき。特にIDが口頭で伝えられたり、手書きで記録されたりすることが多いならなおさらである。
- 視覚的曖昧さを最小化できる文字セットを選びつつ、IDの長さと生成可能な組み合わせ数のあいだで適切な折衷点を見つけることが重要。
- また、サードパーティ製システムとの連携時に予期しない問題が起こる可能性があるため、大文字・小文字を区別するかどうかは慎重に決める必要がある。
- ID生成ロジックでは、特定の文字の組み合わせを除外したり、発音が似ている文字を避けたりといった追加の配慮も必要。
- Crockford's Base32 や Open Location Code のような事例を参考に、プロジェクト要件に合った最適な文字セットを設計するのが望ましい。
3件のコメント
これもよさそうです: https://stackoverflow.com/a/58098360/8556340
発音まで考慮しているなんて、本当に驚異的ですね。
Hacker Newsのコメント
Math::Fleximal)のせいで、思いがけないサポート依頼を受けたことがある。16進数を英数字コードに変換するデモコードを、誰かが本番環境で使っていたのが原因だった。