仕事に効くコンピュータサイエンス
積む・並ぶ・引く — データ構造読了目安 10分

探さない仕組みをつくる — ハッシュと索引

過去の見積書を探すのに、共有フォルダを何度もさかのぼって10分かかった。そんな経験はないでしょうか。探すたびにこの数分が積み重なると、1年ではかなりの時間になります。探す時間そのものをなくす方法が、コンピュータ科学にはあります。

ハッシュと索引の直感

大量のデータから欲しいものを見つけたいとき、いちばん愚直な方法は、先頭から順に1つずつ確認していくことです。データが少ないうちは問題になりませんが、件数が増えるほど、この方法にかかる時間はどんどん伸びていきます。10件の中から1件を探すのと、1万件の中から1件を探すのとでは、かかる時間の桁がまるで違います。5章で見た計算量の考え方でいえば、これは件数に比例して時間が伸びる、いちばん素朴な探し方です。

これに対して、コンピュータ科学には「探さずに引き当てる」ための工夫がいくつも用意されています。その代表的なものが索引です。少し身近な例で、分厚い辞書を思い浮かべてください。最初のページを開いて1文字ずつ読み進め、目的の単語を探す人はまずいません。見出し語がアルファベット順や五十音順にきちんと並んでいるおかげで、目的の単語がどのあたりにあるかを、開く前から一気に絞り込めます。

もう1つの仕組みがハッシュです。少し専門的に聞こえますが、発想は単純です。データそのものから、決まった手順で「置き場所を表す番号」を計算し、その番号の場所に直接しまっておく仕組みです。探すときも同じ手順で番号を計算すれば、しまった場所へ一直線に行けます。コインロッカーで、預けた荷物の番号を覚えておけば、ロッカーの列を端から確認しなくても、その番号の扉を開けるだけで済むのと同じ発想です。

ただし、この仕組みには弱点もあります。異なる2つのデータから、同じ置き場所の番号が計算されてしまうことがあります。これを「衝突」と呼びます。コインロッカーでたとえるなら、2人分の荷物が同じ番号の扉に割り当てられてしまうような状態です。コンピュータの中では、衝突が起きたときの対処法まで含めて設計されていますが、仕事の場面に置き換えると、これは「同じ名前や同じ番号が別のものを指してしまう」問題として現れます。案件番号の採番ルールが甘いと、この衝突が起きやすくなります。

仕事の言葉に翻訳する

索引もハッシュも、仕事の言葉に翻訳すると「探さなくてよい置き場所の設計」になります。資料が増えるたびに探す時間が伸びていくのは、多くの場合、置き場所の設計そのものが「先頭から順に探す」前提のままになっているからです。

具体的には、ファイル名やフォルダの命名規則を統一し、日付・案件名・種類などの決まった順番で並べておくことが、索引を作ることに相当します。名前を見ただけで、あるいはフォルダの階層をたどるだけで、目的の資料の場所が一意に決まる状態が理想です。

タグ付けや検索キーワードの整備は、ハッシュに近い発想です。案件番号や顧客名など、決まった手がかりから直接たどり着けるようにしておけば、案件が増えても、探す手間そのものが増えることはありません。反対に、探す手がかりを用意していないと、資料が増えるたびに探す時間が伸び続け、資料の量そのものよりも、探す手間のほうが業務のボトルネックになっていきます。

具体場面で見る

場面1: 命名規則のない共有フォルダ

案件ごとの資料を、担当者が思い思いのファイル名で保存しているフォルダを想像してください。「見積書_最新」「見積書_最新2」「見積書_確定版」のような名前が並んでいると、どれが本当に最新なのかを開いて確認するまで分かりません。これは索引が存在しない状態そのものです。「日付_案件名_種類」のような命名規則を決めて統一するだけで、ファイル名を見た瞬間に欲しいものが分かるようになり、開いて確認する手間がなくなります。規則を決める際は、並べたときに自然に新しい順・古い順に揃うよう、日付を先頭に置き、年月日の桁数をそろえておくと、一覧の並び自体も見やすくなります。規則は複雑である必要はなく、関係者全員が迷わず守れる単純さのほうが、長く運用できるという点で優れています。

場面2: 顧客情報を案件番号で引き当てる

問い合わせ対応で、顧客の名前だけを頼りに過去のやり取りを探すと、同姓同名や表記ゆれのために何件も候補が出てきて、絞り込みに時間がかかります。案件ごとに一意の番号を発行し、その番号から顧客情報ややり取りの履歴に直接たどり着けるようにしておくと、名前で探す手間そのものがなくなります。番号という手がかりが、ハッシュにおける「置き場所を表す番号」と同じ役割を果たしています。問い合わせを受けた時点で案件番号を確認する一言を添えるだけで、以降のやり取りすべてがその番号から一直線にたどれるようになります。最初の一言を省略してしまうと、あとになって名前や日付だけを頼りに探し直す羽目になり、結局は先頭から確認する愚直な方法に逆戻りしてしまいます。

場面3: 議事録の索引化

積み重なった議事録から、特定のテーマについて過去に何が決まったかを探す場面があります。議事録を作成日順にただ並べているだけでは、テーマで探すたびに全件を見返すことになります。議事録の冒頭にテーマのタグを付け、テーマ別の一覧を別に作っておくと、そのテーマの議事録だけに一気にたどり着けます。これは索引を後から作り足す作業に相当します。既にたまった議事録すべてに一気にタグを付け直す必要はありません。新しく作る議事録からタグを付け始め、過去のものは実際に探す必要が出たときにさかのぼって付ければ十分です。索引を完璧に整えてから使い始めようとすると、着手そのものが先延ばしになりがちです

場面4: 案件番号が衝突するとき

案件番号を「担当者のイニシャルと月」だけで採番していたとします。同じ担当者が同じ月に似た案件を2つ持つと、番号が重複したり、区別のために手作業で枝番を足したりする必要が出てきます。これはまさに前述の「衝突」が起きている状態です。採番のルールに、重複しない通し番号など一意性を保証する要素を1つ加えるだけで、このような衝突はほとんど防げます。手がかりを設計するときは、使いやすさだけでなく、重複が起きない一意性も同時に満たす必要があります。覚えやすさを優先して番号を短くしすぎると、案件数が増えたときに一意性を保てなくなります。逆に一意性だけを優先して桁数を無闇に増やすと、今度は人が覚えにくくなり、入力ミスによる新たな取り違えを招きます。覚えやすさと一意性は、どちらか一方に振り切るのではなく、両方が成り立つ最小限の設計を探るべきものです。

索引は誰のためにあるかを決める

索引やタグ付けを設計するとき、見落とされがちな問いがあります。それは「誰が、どんな手がかりで探そうとするか」です。作成者本人にとって分かりやすい分類が、あとから探す別の人にとっても分かりやすいとは限りません。

たとえば、資料を作成者の名前で分類すると、作成者本人はすぐに見つけられます。しかし別の担当者が「先月のあの案件の資料」を探そうとしたとき、誰が作ったかを覚えていなければ、この分類はまったく役に立ちません。索引は、いちばん頻繁に探す人が、いちばん自然に思いつく手がかりに合わせて設計するべきです。自分のためではなく、あとで探す誰かのために作る、という意識が、索引の使いやすさを大きく左右します。

これは引き継ぎの場面で特に効いてきます。担当者本人にしか通じない略語や、本人だけが覚えているフォルダの階層は、本人が異動や休職をした瞬間に索引としての機能を失います。索引は本人の記憶を補う道具ではなく、本人がいなくなっても機能する仕組みとして設計する必要があります。「自分がいなくても後任が迷わず探せるか」を基準に置き換えるだけで、命名規則やタグの付け方は自然と分かりやすい方向に変わっていきます。

落とし穴・誤用

もっとも多い落とし穴は、索引を作らないまま資料をため続けることです。資料が少ないうちは先頭から探しても大した時間はかかりません。しかし件数が増えるほど、探す時間はじわじわと伸び、ある時点から「探すこと自体が仕事の一部」になってしまいます。命名規則やタグ付けは、資料が少ないうちに整えておくほうが、あとから大量の資料に規則を当てはめ直すよりもはるかに楽です。

もう1つの落とし穴は、索引そのものを更新し忘れることです。命名規則やタグ付けの仕組みを作っても、新しく増えた資料に規則を適用し続けなければ、やがて規則に従った資料と従っていない資料が混在します。索引は一度作って終わりではなく、資料が増えるたびに保守し続ける前提の仕組みです。保守を怠ると、索引がある分だけかえって「どちらを信じればよいか」が分からなくなり、索引がない状態よりも探しにくくなることさえあります。

さらに、細かすぎる索引を作る誤用もあります。分類の項目を増やしすぎると、保存するたびに「どの分類に入れるべきか」を毎回考える手間が発生し、その手間が探す時間の節約分を上回ってしまうことがあります。索引は、探す頻度が高い手がかりに絞って作るのが基本です。めったに使わない分類まで用意すると、索引を作ること自体が新しい負担になります。

最後に、索引と実物がずれてしまう落とし穴もあります。資料を移動したり、案件名を途中で変更したりしたときに、索引側の更新を忘れると、索引をたどっても目的の場所にたどり着けない、という事態が起きます。これは索引が「ないよりはある方がまし」ではなく、「間違った索引はない場合より悪い」ことを示す典型例です。間違った手がかりを信じて探した末に見つからないと、結局は先頭から探し直す羽目になり、索引を信じた分だけ時間を余計に失います。資料を移動・改名する作業と、索引を更新する作業は、常に1セットで行う習慣が要ります。

持ち帰り

  • 索引は「見出しで絞り込む」仕組み、ハッシュは「手がかりから一直線にたどり着く」仕組みである
  • 命名規則やタグ付けは資料が少ないうちに整えるほうが、あとからの手直しより楽である
  • 索引は作って終わりではなく、資料が増えるたびに保守し続ける前提で運用する必要がある

やってみる

よく探し物をする共有フォルダを1つ選び、ファイル名の命名規則を1行で決めて、今日保存する分から適用してみてください。決めた規則は、自分以外の誰かが見ても迷わず守れるかを一度確かめておきましょう。