ユニークID(1)

学生時代にユニークID(一意識別子, unique identifier, UID)という言葉を知った時、世の中の森羅万象にグローバルでユニークな識別子が付けられると面白いのに、と思ったものだ。 最近、余裕が出来たので(笑)これを再考してみる。

モノを識別する(見分ける、区別する)のは、情報処理の出発点だ。人間の思考においても、コンピュータによる処理においても。思いつくままに書いてくけど、最後には UUID(Universal Unique Identifier)に辿りつきたい。学生さんのレポートみたいな感じだけど、及第点に達するだろうか…

そういえば学生の頃は DEC PDP-11の Unibus とベル研の Unix がめちゃ好きだった。言葉の由来は違うけど。なお、UNIQLO はあまり好きではない。

身近なユニークID

分野や業界の中でのみユニーク(一意)なID(番号)は様々に存在する。

そういう、一意性の通用する範囲を、コンピュータ(プログラミング)の業界では「局所スコープ(視野)」と呼ぶ。ローカル/グローバル、プライベート/パブリック、イントラ/インターという表現もある。

ネットユーザとして身近なものには、固定長ならIPアドレス(32ビット/IPv4, 128ビット/IPv6)やMACアドレス(48ビット)、可変長(1)ならドメイン名(2)やメールアドレス、あるいはURLがある(3)。最近はあまり表に出ないけど、メールのMessage-IDもある。

(1)可変長とは言え、実装から来る制限はあり、最大長は決められている。
(2)今ではユニークID(絶対アドレス)として当たり前に使われているドメイン名も、それほど歴史は古くない。30年くらい前は、相対アドレス(到達経路パス)だった…
(3)World Wide Webが果たした最大のブレークスルーは、HTTPでもHTMLでもなくURL(Universal/Uniform Resource Locator)だと思っている。ハイパーテキストは古くからあったけど、ハイパーリンク(つまりResource Locator)の表現がグローバルにユニークでは無かった。IPアドレスはグローバルにユニークだったけど、識別できる対象の数が少なすぎた。私自身はMessage-IDを使って同じようなことにトライしていたので、URLにはヤラレタ感があった。

消費者としては書籍番号(ISBN, 13桁)、商品番号(JANコード, 13桁)を良く目にする。日本では比較的最近、個人番号(12桁)や法人番号(13桁)が導入され、これも身近なユニークIDになった。電話番号は10桁か11桁。これらはもちろん、十進表記であり、ふつうの人にとって可読性が良く、記憶もできる。

そもそも住所(番地, アドレス)というものはグローバルにユニークなIDとして最古のもののはずだが、可変長であり、簡単に作れず、識別できる対象の粒が荒すぎるという問題がある。

ヒトにやさしいユニークID

よく、人間が短期記憶できるのは7つまでと言われているが、年寄りには長期記憶だって怪しい。ただ、桁ごとの意味を分解して知っていれば、実際に覚えなければならない桁(塊り, chunk)は少ない。例えば192.168.1.32というプライベートIPアドレスで覚えとかないといけないのは、192.168(つまりプライベート)および1という塊りと32という値の3塊だけになる。

また、IP (v4) では32ビットのアドレスを8ビット(バイト)単位で区切って、たとえば16進表記で 0xC0A880A4 のところを、192.168.128.164 のように10進表記して来た。これで上記のように、身近な生活でなじみの深い12桁の10進表記になる。これは、ヒトが誤らずに認識したり書き写したり伝達したりできる限界に関係するのかも知れない。よくあるライセンスキーの多くはこれを超えており、間違わずに入力するのにひどく疲れる。

十進の13桁(10の13乗)は2の44乗(二進44ビット)で表現できる(10,000,000,000,000 == 0x9184E72A000)。これは10テラであり、10,0000,0000,0000 つまり十兆だ。現代の一般人が現実感をもって語れる最大値のように思う。さらにペタ、エクサを耳にすることはあるが、その上がゼタ、ヨタというのを知らなかった。1991年に制定されたばかりそうだし。こんなヨタ話を書き綴るのにふさわしいか(笑)。ヨタは10の24乗、92ビットで表現できる。

コンピュータの世界では32ビット(4バイト)が、長らく数値データやアドレス値の単位「ワード」としての地位にあった。32ビットは約4ギガなので、メモリやファイルのサイズがこれをまたぐようになった過渡期に「64ビット対応」騒動があった。あれは空騒ぎで済んだ2000年問題に前後して顕れた。次に2038年問題が控えているが、私も見届けたいものだ(笑)

全体の桁数とは違うが、視認性も非常に重要だ。12桁をベタに書かれたら認識しにくいが、3桁ずつ4つに分ければ、即記憶はできないにしろ、認識し伝えやすい。その意味を知らず192168128164 を見て手作業で書き写すのは難しい。

ここではとりあえず、ヒトにやさしいユニークIDは8桁程度の数字、という結論にしておこう。そうしよう。

こういう人間工学(エルゴノミクス)的な話は、とっくに出尽くしていると思うので、この辺で自前の考察は停止しよう。とはいえ、そういう事が踏まえられてないような事例もまだ身の回りにあったような…まあ、パスワードとかかな。最近は短いPINとかパスコードが使われる事が多くなったけど。

今回、各種の届出書や申請書に、法人番号を手作業で書き写し間違えて懲りた。ので、その後はPDFを編集するようになった…

コンピュータにやさしいユニークID

ユニークIDには(その良し悪しには)人間向けの側面(短期・長期に記憶できる、間違えずに伝え書き写せる、とか)と、機械での処理向けの側面(入出力、転送時間、記憶容量、とか)がある。いずれにしても、固定長にしろ可変長にしろ、長さには制限がある。

コンピュータにとってやさしい(易しい)ユニークIDって何だろう。

ユニークIDをユニークにするために、その生成(採番あるいは命名)の方法が課題になる。集中管理を行うものと、あらかじめ桁(あるいは階層)ごとの意味を決めておいて(つまりスコープを局所化して)分散管理ができるものに分かれる。

分散してローカルに採番(あるいは命名)した場合には、それをグローバルに公知するシステムが必要になる。ドメイン名においては、DNSだ。DNSのネットワークがおかしくなると、世の中は大混乱に陥ってしまう。

どちらにしても、あまりコンピュータにやさしくない。それと、識別される側に相談せずに勝手に作られたIDは、IDが識別している(指し示している)先のモノが何であるか(個性とか)を、何も表明(証明)していない。そこで登場するのがハッシュ値(ダイジェスト値)だ。

おなかがすいたのでこのへんにしよう。そうしよう。UUIDまではまだ遠い。

2020-0409 sato@izmoh