

シャッフルされた学生番号とハッシュ
大学では学生さんたちの情報管理に学生番号(または学籍番号など)という数値をつかいます。会社も社員の番号があるでしょうし、日本全体ではマイナンバーがあります。これらの番号は、何らかのルールに従って重複無く割り振られた番号です。氏名で区別しようとすると、どの漢字か(とくに同じ名字でも文字が多数ある場合など)などで照合の煩雑さがあるほか、漢字まで一致した同姓同名が区別できなくなります(実際に大学のクラスであったときには番号でしか区別できなかった)。また、数値には大小があるため、コンピュータ内での比較や参照などがしやすく、非常に便利です。
日常的に書類に「氏名」と「番号」を併記で書くことを求められますが、おそらく「番号」のほうが主で、処理をするときに番号をまず入力して、番号から検索された氏名と、記載の氏名が一致するかチェックします。氏名を書くのは番号を書き間違ったときの対策として、場合によっては本人が書いたことの筆跡の検証をするためです。重要度の高いものでは、本来必要な数値の他にもう一桁、何らかの計算で決まるようなチェック用の桁を用意して、ひとつの書き間違い、読み間違いくらいは検出できるようにします。
さて、学校における番号の設定には、しばしば五十音順が用いられます。私は小学校のときには誕生日順だったので常に最後だったのですが、付番根拠によってはそのような非公開属性が見えることがあります。本学も五十音順だったのですが、2年前からシャッフルされて、氏名と番号が一見するとランダムになりました。そのときは驚き抵抗を感じましたが、考えてみれば私は出席や提出物、成績の管理は番号で行い、氏名は上記の通りチェック用ですので、五十音順の必要はありませんでした。シャッフルすることにした理由はいくつか考えられるのですが、ひとつ便利なことに「佐藤班」の問題が消えました。
実験実習をする際に学科を数人単位の班に分けることがあります。われわれの作業効率を考えて、番号順に人数ずつ区切って行きますが、総勢100人もいると佐藤さんが数人いて、場合によってはほとんど佐藤さんという班ができます。下の名前で呼ぶか、「○○番の佐藤さん」と言わなければなりません。シャッフルされると、この問題はほぼ回避され、同じ名字の人が同じ班にいることは偶然になります。
似たような考え方は物品管理にも使われると聞きます。代表的な事例はピッキング作業をする場での並び順です。たとえば、ネジなどの部品を引出しにしまうときに、直感的には同じ規格で長さ順で並べたくなります。その場合、隣接する区画に見た目の似たものが並ぶことになり、取り出すときに良く見る必要があります。一方で、M3x10ネジとM6x20ボルトとM2ナットとM5ワッシャという組合わせであれば、仕切り無くまとめて入れられていたとしても、見ても手触りでも区別がつきます。もちろん、欲しいネジがその引出し、ということを特定できる何か手段が別に必要ですし、「近い何かを探したい」ときには逆にやりにくくなりますが、あえてバラバラにするとピッキングミスは減らせます。
対象の数値化とハッシュ値
何かを扱うときに何らかの方法で番号化(数値化)して、番号を識別に扱うことは、とくにコンピュータ管理する今では必然ですが、どう振るかは効率に関わる問題です。学生番号は、あえてランダム化することで、番号順に並べたときに他人と混同するリスクを減らせましたが、もちろん順番になっている方が良い場合もあります。そもそも種類も多様な物品のときにどう数値化するのか。
様々なものを数値化する手段のひとつにハッシュ関数、ハッシュ値とよばれるものがあります。これは対象のデータや特性値から、そのデータよりもずっと桁数の少ない数値に変換する手法です。学生番号は1対1での割付けですが、ハッシュ値はしばしば重複したり、その数値に該当するもの無しというケースも許容します。一例をあげると、「誕生日の月と日を足して、7で割った余り」のような演算で、4桁で表される数値が0~6の7グループに分かれます。たとえば30人のクラスで誕生日が同じ人がいるかを確認するのに全員でやると大変ですが、この演算で同じグループになった少人数であれば楽になります。同じような演算には「日付の下一桁」「月日の全ての桁の数字を足して」「今年のカレンダーでの曜日」など様々な方法が想定できますが、結果の偏りやすさ、隣接するものが同じ数値になりやすいか散らばりやすいか、などの性質を評価して適した方法を選びます。前述のネジの引出しも、種類や太さ、長さを何らかの演算で数値化して「欲しい部品→○番の引出し」のような対応付けをしつつ、似た部品は同じ引出しに入らないような変換方法を使えばよいわけです。
このハッシュは様々な用途に用いられています。代表的な例が検索の高速化で、全部のリストから探すと大変なときに、たとえば0~99の値の出るハッシュを使い、検索対象を予めその100種に区分しておけば、その1区分だけを探せばよくなります。もうひとつはデータの破損検知や改ざん対策です。巨大なデータを送受するとき、あるいはそのコピーを流通させるときに、そのデータに対して何らかのルールでハッシュ値を出しておきます。受け手は受信後に手元でハッシュ値を計算し、送り手のハッシュ値と比較し、一致していれば良しとします。もちろん、ハッシュ値が一致するようなエラーや偽物はあり得るのですが、ハッシュ関数を適切に設計すれば、ちょっとの違いで全く異なるハッシュ値を出せるので、十分に検知できます。
ある種の姓名や誕生日を使う占いも、氏名の画数や誕生日などを元になにか演算をして、数種類にして(しばしば○○型などもっともらしく名前を付けて)、それで対応表を示したりしますが、あれもまた、ハッシュ値といえ、可能性ある全種類について述べることが困難なので、種類を減らしてしまっているわけです。もちろん、その減らす演算で、なにか共通する特性が同じ数値にならなければ、意味あるハッシュ値にはなっていないのですが。
この記事は、会員専用記事です。
有料会員になると、会員限定の有料記事もお読みいただけます。