Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18547] ファイルの概要

このコミットは、Go言語の標準ライブラリ crypto/md5 パッケージ内の example_test.go ファイルに、Sum 関数の使用例を追加するものです。具体的には、md5.Sum 関数がどのようにバイトスライスからMD5ハッシュを直接計算し、その結果をフォーマット済み文字列として出力するかを示す新しいテスト関数 ExampleSum が追加されています。

コミット

crypto/md5: Sum の使用例を追加

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/2be94b1ba650d6ce106ca131a966150454708595

元コミット内容

crypto/md5: add example for Sum
    
LGTM=dave
R=golang-codereviews, dave
CC=golang-codereviews
https://golang.org/cl/64820044

変更の背景

Go言語の標準ライブラリでは、各パッケージの機能や使用方法を明確にするために、_test.go ファイル内にテストコードだけでなく、Example 関数を用いた使用例を記述することが推奨されています。これらの Example 関数は、go doc コマンドや Go言語の公式ドキュメントサイト で自動的に抽出され、ユーザーがライブラリの利用方法を理解する上で非常に役立ちます。

このコミット以前は、crypto/md5 パッケージには md5.New() を使用してハッシュを計算する例は存在しましたが、md5.Sum() 関数を直接使用する例がありませんでした。md5.Sum() は、入力全体が一度に利用可能である場合に、より簡潔にMD5ハッシュを計算できる便利な関数です。このコミットは、この重要な関数の使用方法を公式ドキュメントに含めることで、ユーザーの利便性を向上させることを目的としています。

前提知識の解説

MD5 (Message-Digest Algorithm 5)

MD5は、128ビット(16バイト)のハッシュ値を生成する暗号学的ハッシュ関数です。任意の長さの入力データから、固定長の短いハッシュ値を生成します。このハッシュ値は「メッセージダイジェスト」とも呼ばれ、データの整合性チェックやデジタル署名などに利用されてきました。

MD5の特性:

  • 一方向性: ハッシュ値から元のデータを復元することは非常に困難です。
  • 衝突耐性: 異なる入力データから同じハッシュ値が生成される(衝突)確率は非常に低いとされていましたが、現在では衝突攻撃が可能であることが知られており、セキュリティ目的での利用は推奨されません。しかし、データの同一性確認など、非セキュリティ目的では依然として広く利用されています。

Go言語の crypto/md5 パッケージ

Go言語の標準ライブラリ crypto/md5 パッケージは、MD5ハッシュ関数を実装しています。このパッケージには主に以下の2つの方法でMD5ハッシュを計算する機能が提供されています。

  1. md5.New()hash.Hash インターフェース:

    • md5.New()hash.Hash インターフェースを実装した新しいハッシュオブジェクトを返します。
    • Write([]byte) メソッドを使用して、データをチャンク(断片)ごとにハッシュオブジェクトに書き込むことができます。これは、大きなファイルやストリームデータを処理する際に便利です。
    • Sum([]byte) メソッドを呼び出すことで、これまでに書き込まれたデータ全体のハッシュ値を取得します。引数にバイトスライスを渡すと、そのスライスにハッシュ値が追加されて返されます。通常は nil を渡して新しいスライスにハッシュ値を取得します。
  2. md5.Sum([]byte) 関数:

    • この関数は、入力データ全体がすでにバイトスライスとしてメモリ上に存在する場合に、一度にMD5ハッシュを計算するための簡潔な方法を提供します。
    • [16]byte 型の配列としてハッシュ値を返します。これは、MD5ハッシュが常に16バイト固定長であるためです。

Go言語の Example 関数

Go言語のテストフレームワークは、単体テスト (Test 関数) だけでなく、ドキュメント生成のための Example 関数もサポートしています。

  • Example 関数は Example<FunctionName> または Example<TypeName> の形式で命名されます。
  • これらの関数は、go test コマンドで実行される際に、標準出力に特定の文字列 (Output:) が含まれているかをチェックします。これにより、例が正しく動作し、期待される出力を生成していることが保証されます。
  • 最も重要なのは、go doc コマンドや pkg.go.dev でパッケージのドキュメントを生成する際に、これらの Example 関数が自動的に抽出され、その関数の使用例として表示される点です。これにより、ユーザーはコードの動作を視覚的に理解しやすくなります。

技術的詳細

このコミットで追加された ExampleSum 関数は、md5.Sum 関数の典型的な使用パターンを示しています。

  1. 入力データの準備: input := "The quick brown fox jumps over the lazy dog." MD5ハッシュを計算したい文字列を定義します。

  2. バイトスライスへの変換: []byte(input) Go言語では、ハッシュ関数は通常バイトスライス ([]byte) を入力として受け取ります。そのため、文字列をバイトスライスに変換します。

  3. md5.Sum の呼び出し: md5.Sum([]byte(input)) md5.Sum 関数を呼び出し、入力バイトスライスを渡します。この関数は [16]byte 型のMD5ハッシュ値を返します。

  4. ハッシュ値のフォーマットと出力: fmt.Printf("%x", md5.Sum([]byte(input))) fmt.Printf を使用して、計算されたハッシュ値を16進数形式 (%x) で標準出力に出力します。MD5ハッシュは16バイトなので、16進数で表現すると32文字の文字列になります。

  5. 期待される出力の指定: // Output: e4d909c290d0fb1ca068ffaddf22cbd0 これはGoのテストフレームワークが Example 関数を検証するために使用する特別なコメントです。go test を実行すると、この ExampleSum 関数が実行され、その標準出力がこの Output: 行に続く文字列と厳密に比較されます。一致しない場合、テストは失敗します。これにより、ドキュメントに表示される例が常に正確であることが保証されます。

この例は、md5.Summd5.New().Sum(nil) のような複数ステップの操作を必要とせず、単一の関数呼び出しで完結できることを明確に示しています。

コアとなるコードの変更箇所

diff --git a/src/pkg/crypto/md5/example_test.go b/src/pkg/crypto/md5/example_test.go
index 28be770a7a..e8ecab15f5 100644
--- a/src/pkg/crypto/md5/example_test.go
+++ b/src/pkg/crypto/md5/example_test.go
@@ -17,3 +17,9 @@ func ExampleNew() {
 	fmt.Printf("%x", h.Sum(nil))
 	// Output: e2c569be17396eca2a2e3c11578123ed
 }
+
+func ExampleSum() {
+	input := "The quick brown fox jumps over the lazy dog."
+	fmt.Printf("%x", md5.Sum([]byte(input)))
+	// Output: e4d909c290d0fb1ca068ffaddf22cbd0
+}

コアとなるコードの解説

変更は src/pkg/crypto/md5/example_test.go ファイルに対して行われています。

既存の ExampleNew 関数の後に、新しい ExampleSum 関数が追加されています。

func ExampleSum() {
	// MD5ハッシュを計算する対象の文字列を定義します。
	input := "The quick brown fox jumps over the lazy dog."
	// md5.Sum 関数を呼び出し、文字列をバイトスライスに変換して渡します。
	// md5.Sum は [16]byte 型のハッシュ値を返します。
	// fmt.Printf の %x フォーマット動詞は、バイト配列を16進数文字列として出力します。
	fmt.Printf("%x", md5.Sum([]byte(input)))
	// このコメントは、go test が Example 関数を検証するために使用するものです。
	// 関数の標準出力がこの行に続く文字列と一致することを期待します。
	// これは "The quick brown fox jumps over the lazy dog." のMD5ハッシュ値です。
	// Output: e4d909c290d0fb1ca068ffaddf22cbd0
}

このコードは、md5.Sum 関数がどのように使用されるかを簡潔かつ明確に示しています。特に、md5.New() を使用してハッシュオブジェクトを作成し、データを書き込み、最後に Sum(nil) を呼び出すという一連のステップを必要とせず、単一の関数呼び出しでハッシュ計算が完結する点が強調されています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (pkg.go.dev)
  • Go言語のテストに関する公式ドキュメント
  • MD5に関する一般的な情報源 (例: Wikipedia)
  • Go言語の Example 関数に関する情報源 (例: Goブログ、Goのテストに関する記事)