Software Hash Identifier
SWHID は Software Hash IDentifier の略で、ハッシュをもとに決められた識別子で、バージョン管理システムの特定のリビジョンや、任意のファイルを特定するために使用することができます。ISO/IEC 18670 として標準化されています。
一部の文献では、SWHID は SoftWare Heritage persistent IDentifier の略とされていることがあります。もともとは、世界中のあらゆるソースコードをアーカイブする SoftWare Heritage Project のデータベースモデルの一部でした。現在では、他の用途でも使用できるように分離されています。仕様の新しさの観点と、ドキュメントの説明がより詳しいことから、Software Heritage Project ではなく、SWHID のドキュメントを参照したほうが良いでしょう。
SBOM でも SWHID を見かけます。SPDX 3.0.1 では、コンポーネントのハッシュ値を保持する Software.ContentIdentifier と、外部データベースへの参照に使える識別子を保持する Core.ExternalIdentifier で SWHID を使用できます。ハッシュ値と識別子と両方の役割で使用することができます。Cyclone DX 1.6 では Component が swhid 属性を持ち、SWHID を保持できます(Software Heritage Persistent Identifier として)。
SWHID の特徴
構造
SWHID は次のような:区切りの構造の文字列です。
swh:1:cnt:ae0d1ddc246fb6bcc3c263fd53f6276e0210dabd
細かい文法については、仕様を参照してもらうとして、簡単に説明すると、先頭の swh は SWHID を指すための固定文字列です。次の 1 はバージョンで、cnt はこの SWHID が指すオブジェクトの種類を特定するもので、詳細は後述します。最後はハッシュベースの識別子です。
さらに、この後ろに、; 区切りで行やバイト数での範囲や、オブジェクトを見つけることができる URL といった情報を修飾子としてつけることもできます。
オブジェクトの種類
cnt の部分にあるオブジェクトの種類には、次の5種類が定義されています。
-
cnt: ファイルのコンテンツ -
dir: ディレクトリ -
rev: リビジョン -
rel: リリース -
snp: スナップショット
cnt: ファイルのコンテンツ(バイト列)
ファイルをコンテンツベースで特定する識別子です。同じファイルがコピーされて他のリポジトリに保存されているような場合でも、これら2つのファイルは同一の識別子を持ちます。バージョンが変わっても、ファイルの中身が変わらなかった場合も同一の識別子となります。そのため、ファイルの内容ベースで、ファイルに対して何かをデータベースで保持したい場合のキーとして使えます。例えば、ファイルのライセンスを調査した結果を保存する場合などがあります。
ハッシュ値部分は、次のようなバイト列を連結したものに対して計算した、SHA1 チェックサムです。
- "blob" を ASCII でエンコードしたバイト列
- ASCII のスペース
- コンテンツの長さを ASCII でエンコードされた10進数数字
- NULL 文字
- ファイルの実際のコンテンツ
実は、Git において、ファイルを blob オブジェクトとして管理する際に使用する識別子の計算方法と同じです。
SWHID の周辺ツール
swh コマンドを使用して SWHID を計算することができます。
% swh identify data_loader.cc
swh:1:cnt:ae0d1ddc246fb6bcc3c263fd53f6276e0210dabd data_loader.cc
この data_loader.cc はどこの誰のコードでしょうか?答えはここに書いていませんが、Software Heritage のデータベースから検索することで、簡単にファイルの中身を見ることができます。
以下の URL にアクセスして、検索ボックスに上記の SWHID を入力してみてください。
https://archive.softwareheritage.org/api/
まとめ
ハッシュベースの識別子、SWHID を紹介しました。ファイルをコンテンツベースでライセンス情報などと紐づけて管理するときに、ID として使用したり、ファイルは保存したくないけど、中身は参照できるようにしたい場合など活用の場はいろいろありそうです。