言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

wiki なひとりごと

時差のおかげで折角ぼんやりできる一日が出来たのにも関わらずすっかり寝てすごしてしまう。そのおかげで今度は眠れない(泣。まあいいか、眠くないので少し考えを整理。

  • ハッシュとは、あるファイルの内容(ビット配列)を元に決められるある数値。同じハッシュを持つファイルは(殆ど)存在しないので、ファイルの同一性チェックに使える。
  • URL とは、リソース(ファイル)の位置を表す情報。
  • 問題: P2P ネットワークで共有されるファイルを参照する方法。
  • 問題: P2P ネットワークでハイパーリンクを実現する方法。
  • 問題: P2P ネットワークにおける「リンク切れ」の解決。
  • 問題: ユーザが、リンクを指定する方法。

http://d.hatena.ne.jp/propella/20050822/p3 でちらりと匿名 P2Pwiki の可能性について書きました。要旨は、ファイルを特定するためには URL やファイル名では無くハッシュ等の ID を使うべきだという話。理由は、URLがディレクトリ等の構造によって決められるのにハッシュはファイル自身に付けられるという点。

問題は、このようにして ID からファイル内容をどうやって探せば良いかという話。URL やファイル名では、それ自身に位置情報を含んでいるので問題にならないが、ID から実際の位置を知る事が出来ない。ググルと、DHT というのがこの目的に使われるらしい http://homepage3.nifty.com/toremoro/p2p/dht1.html 。というわけで、ハッシュとURLの違いはこうなる。

  • URL: ファイルの位置に着目。URLが同一のコンテンツは同じである可能性が高い。
  • ハッシュ: ファイルの内容に着目。ハッシュが同一のコンテンツは同じ。位置は問わない。

と、ハッシュの方が便利そうに見えるのだが、実はハイパーリンクの指定先としてそのままでは使えない。ハイパーリンクでは、リンク先が更新された場合に、何もしなくともその更新が元の文書に反映されなくてはならない。これは URL では問題にならない。なぜなら、URL が指すのは文書自体ではなく、文書の場所だから。しかし、ハッシュは文書自体を指してしまうために、リンク先を更新したらリンク元全てを書き換えないといけない羽目になる。

これを防ぐためには、リンク先として、内容のハッシュ自体では無く、ハッシュを指す「シンボリックリンク」を指すべきだろう。ある内容を編集したあと、忘れずその唯一のシンボリックリンクを更新する。そうすればリンク元の文書を変更しなくても良い。(嘘。シンボリックリンク自体を共有する事が出来ないのですぐ破綻する(シンボリックリンクを共有してしまうと、共有したリンク全てに変更を反映させないといけないので、結局同じ))

この方式の利点として、ある文書の「ログ」を表すリンク先が自動的に定義出来る。文書の最新版ではなく、ある時点のスナップショットをリンクしたい場合にはシンボリックリンクではなく、文書自体のハッシュをリンクすれば良い。

残念ながら、リンク切れ問題には対処する事が出来ない。将来ストレージの増加速度が人類の情報の生成速度を超えれば、これは根本的に解決するだろう。しかしそれまでは、ある情報が失われる可能性を失くす事は出来ない。せめて、ハッシュによるファイル指定が位置に拘らない事から、自分に必要なファイルをローカルキャッシュに貯めて置く事は出来る。

ハッシュはハイパーリンクとして使えない

散々考えて、「ハッシュの内容を更新できない」という事から、残念ながらハッシュはそのままリンクの代わりに使えない事が分かった。妥協点として、次の事が考えられる。

  • リンク先が自動的に更新して欲しい場合(普通の場合)、リンク先として「名前」を指定。
  • リンク先が情報の特定のバージョンを指す場合。リンク先としてハッシュを指定。イミュータブル(不変)リンクと呼びます。

もしかして、URL にはハッシュを含める事も出来るので、上では URL と書いてしまったのを「名前」と呼ぶことにします(名前は名乗る物ではなく、名付けられるという考えによります)。「名前」にした場合、ローカルキャッシュとの同一性を保障出来ないため、よりリンク切れ問題に脆弱に鳴ります。