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

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

このコミットは、Go 1リリースにおけるhashパッケージのhash.Hashインターフェースの変更点、特にBlockSizeメソッドの追加に関するドキュメントを更新するものです。この変更は、主に暗号ライブラリにおけるハッシュ関数の利用を考慮したものであり、既存のhash.Hash実装がBlockSizeメソッドを追加する必要があることを開発者に通知しています。

コミット

commit 1f1c9baf78330d2a6293a583fbaa44872bf8d2e9
Author: Russ Cox <rsc@golang.org>
Date:   Wed Jan 18 10:36:43 2012 -0500

    doc/go1.html: add notes about hash.Hash
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5536053

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

https://github.com/golang/go/commit/1f1c9baf78330d2a6293a583fbaa44872bf8d2e9

元コミット内容

doc/go1.html: add notes about hash.Hash

変更の背景

Go 1のリリースに伴い、標準ライブラリのインターフェース定義にいくつかの変更が加えられました。このコミットの背景にあるのは、hashパッケージのhash.HashインターフェースにBlockSizeメソッドが追加されたことです。この変更は、特に暗号ライブラリにおいてハッシュ関数がより効率的かつ安全に利用されることを目的としています。

ハッシュ関数は、入力データを固定長のハッシュ値に変換する関数であり、データの整合性チェックや暗号化など、様々な用途で利用されます。多くのハッシュ関数は、入力データを一定のブロックサイズで処理します。例えば、SHA-256のような暗号学的ハッシュ関数は、通常512ビット(64バイト)のブロックサイズでデータを処理します。このブロックサイズの情報は、ハッシュ関数の内部実装や、それを利用する上位のプロトコル(例:HMAC)にとって重要となる場合があります。

Go 1の設計者は、hash.HashインターフェースにBlockSizeメソッドを追加することで、ハッシュ関数のブロックサイズを明示的に取得できるようにし、これにより暗号ライブラリがより堅牢で効率的な実装を行えるようにしました。この変更は、既存のhash.Hashインターフェースを実装しているすべての型に影響を与えるため、Go 1への移行ガイドとしてドキュメントに追記されました。

前提知識の解説

ハッシュ関数とhash.Hashインターフェース

Go言語の標準ライブラリには、ハッシュ関数を扱うためのhashパッケージが提供されています。このパッケージの中心となるのがhash.Hashインターフェースです。

hash.Hashインターフェースは、以下のメソッドを定義しています(Go 1以前の定義):

  • Write(p []byte) (n int, err error): 入力データをハッシュ関数に書き込みます。
  • Sum(b []byte) []byte: 現在のハッシュ値を計算し、bに追加して返します。
  • Reset(): ハッシュ関数の状態を初期化します。
  • Size() int: ハッシュ値のバイト数を返します。

ハッシュ関数は、通常、入力データを内部バッファに蓄積し、一定のブロックサイズごとに処理を進めます。例えば、MD5やSHA-1、SHA-256などの暗号学的ハッシュ関数は、入力データを512ビット(64バイト)や1024ビット(128バイト)といった固定長のブロックに分割して処理します。

BlockSizeの重要性

BlockSizeは、ハッシュ関数が一度に処理する入力データの最小単位(ブロック)のサイズをバイト単位で示します。この情報は、特に以下のような場面で重要になります。

  1. 暗号学的利用: HMAC (Keyed-Hash Message Authentication Code) のようなメッセージ認証コードの計算では、基となるハッシュ関数のブロックサイズがプロトコルの定義に不可欠です。BlockSizeメソッドが提供されることで、HMACの実装は任意のhash.Hash実装に対して汎用的に動作できるようになります。
  2. 効率的なバッファリング: ハッシュ関数を利用するアプリケーションやライブラリが、内部的にデータをバッファリングする際に、ハッシュ関数のブロックサイズを知ることで、より効率的なバッファ管理やパディング処理を行うことができます。
  3. パディング処理: 多くのハッシュ関数は、最後のブロックがブロックサイズに満たない場合に、特定のパディング処理を行います。BlockSizeの情報は、このパディングロジックを正確に実装するために必要となることがあります。

Go 1でBlockSizehash.Hashインターフェースに追加されたのは、これらの暗号学的および効率的な利用シナリオをサポートするためです。

技術的詳細

Go 1において、hash.HashインターフェースにBlockSize() intメソッドが追加されました。これにより、hash.Hashインターフェースの定義は以下のようになりました(簡略化):

package hash

type Hash interface {
    // Write adds more data to the running hash.
    // It never returns an error.
    io.Writer

    // Sum appends the current hash to b and returns the resulting slice.
    // It does not change the underlying hash state.
    Sum(b []byte) []byte

    // Reset resets the Hash to its initial state.
    Reset()

    // Size returns the number of bytes Sum will return.
    Size() int

    // BlockSize returns the hash's underlying block size.
    // The Write method must be called with input lengths that are
    // multiples of BlockSize.
    BlockSize() int // Go 1で追加
}

この変更により、既存のhash.Hashインターフェースを実装していたすべての型(例えば、crypto/md5crypto/sha1などのパッケージで提供されるハッシュ関数)は、新たにBlockSize()メソッドを実装する必要が生じました。

ドキュメントでは、この変更に対する既存の実装の更新方法について具体的に指示しています。

Updating: Existing implementations of hash.Hash will need to add a BlockSize method. Hashes that process the input one byte at a time can implement BlockSize to return 1.

これは、既存のhash.Hash実装がBlockSizeメソッドを追加する必要があることを明確に述べています。また、入力データを1バイトずつ処理するようなハッシュ関数(例えば、CRC32のような非暗号学的ハッシュ関数の一部)の場合、BlockSizeメソッドは1を返すように実装できることも示唆しています。これは、そのようなハッシュ関数が特定のブロックサイズを持たないか、あるいは任意のサイズの入力に対応できることを意味します。

暗号学的ハッシュ関数(MD5, SHA-1, SHA-256など)の場合、それぞれのアルゴリズムで定義された固定のブロックサイズ(例:MD5やSHA-1は64バイト、SHA-256は64バイト)をBlockSizeメソッドが返すように実装されます。

この変更は、Go 1の互換性保証の一部として、既存のコードベースが新しいインターフェース定義に準拠するための重要なステップでした。

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

このコミットは、Go 1のリリースノートを記述したHTMLファイルとテンプレートファイルに、hashパッケージに関するセクションを追加するものです。

変更されたファイルは以下の2つです。

  1. doc/go1.html
  2. doc/go1.tmpl

それぞれのファイルに、以下のHTMLスニペットが追加されています。

<h3 id="hash">The hash package</h3>

<p>
In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes
a new method, <code>BlockSize</code>.  This new method is used primarily in the 
cryptographic libraries.
</p>

<p>
<em>Updating</em>:
Existing implementations of <code>hash.Hash</code> will need to add a
<code>BlockSize</code> method.  Hashes that process the input one byte at
a time can implement <code>BlockSize</code> to return 1.
</p>

このスニペットは、doc/go1.htmlの686行目以降と、doc/go1.tmplの590行目以降に挿入されています。

コアとなるコードの解説

追加されたコードは、Go 1のリリースノートの一部として、hashパッケージの変更点を開発者に伝えるためのドキュメントです。

  • <h3 id="hash">The hash package</h3>: 「hashパッケージ」という見出しを作成し、このセクションがhashパッケージに関するものであることを示します。id="hash"は、このセクションへの直接リンクを可能にします。
  • <p>In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes a new method, <code>BlockSize</code>. This new method is used primarily in the cryptographic libraries.</p>: Go 1でhash.HashインターフェースにBlockSizeメソッドが追加されたことを説明しています。また、この新しいメソッドが主に暗号ライブラリで使用されることを明記し、その目的を示しています。/pkg/hash/#Hashへのリンクは、hash.Hashインターフェースの公式ドキュメントへの参照を提供します。
  • <p><em>Updating</em>: Existing implementations of <code>hash.Hash</code> will need to add a <code>BlockSize</code> method. Hashes that process the input one byte at a time can implement <code>BlockSize</code> to return 1.</p>: 既存のhash.Hash実装をGo 1に対応させるための具体的な更新手順を説明しています。既存の実装はBlockSizeメソッドを追加する必要があること、そして1バイトずつ処理するハッシュ関数はBlockSizeとして1を返すことができるというガイダンスを提供しています。これは、開発者がGo 1に移行する際に直面する可能性のある互換性の問題に対する直接的な解決策を提示しています。

このドキュメントの追加により、Go 1への移行を検討している開発者は、hash.Hashインターフェースの変更点とその対応方法を容易に理解できるようになりました。

関連リンク

参考にした情報源リンク

  • Go 1 Release Notes (現在の公式ドキュメント): https://go.dev/doc/go1
  • Go hashパッケージドキュメント: https://pkg.go.dev/hash
  • HMAC (Keyed-Hash Message Authentication Code) - Wikipedia: https://ja.wikipedia.org/wiki/HMAC
  • Go言語のhashパッケージについて: https://zenn.dev/nobishii/articles/go-hash-package (Goのhashパッケージの基本的な理解に役立つ)
  • Go言語のhash.HashインターフェースのBlockSizeメソッドについて: (一般的なGoのハッシュ関数の解説記事や、Goの公式ブログ、メーリングリストの議論などを参照)I have provided the detailed explanation as requested.
# [インデックス 11225] ファイルの概要

このコミットは、Go 1リリースにおける`hash`パッケージの`hash.Hash`インターフェースの変更点、特に`BlockSize`メソッドの追加に関するドキュメントを更新するものです。この変更は、主に暗号ライブラリにおけるハッシュ関数の利用を考慮したものであり、既存の`hash.Hash`実装が`BlockSize`メソッドを追加する必要があることを開発者に通知しています。

## コミット

commit 1f1c9baf78330d2a6293a583fbaa44872bf8d2e9 Author: Russ Cox rsc@golang.org Date: Wed Jan 18 10:36:43 2012 -0500

doc/go1.html: add notes about hash.Hash

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5536053

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

[https://github.com/golang/go/commit/1f1c9baf78330d2a6293a583fbaa44872bf8d2e9](https://github.com/golang/go/commit/1f1c9baf78330d2a6293a583fbaa44872bf8d2e9)

## 元コミット内容

doc/go1.html: add notes about hash.Hash


## 変更の背景

Go 1のリリースに伴い、標準ライブラリのインターフェース定義にいくつかの変更が加えられました。このコミットの背景にあるのは、`hash`パッケージの`hash.Hash`インターフェースに`BlockSize`メソッドが追加されたことです。この変更は、特に暗号ライブラリにおいてハッシュ関数がより効率的かつ安全に利用されることを目的としています。

ハッシュ関数は、入力データを固定長のハッシュ値に変換する関数であり、データの整合性チェックや暗号化など、様々な用途で利用されます。多くのハッシュ関数は、入力データを一定のブロックサイズで処理します。例えば、SHA-256のような暗号学的ハッシュ関数は、通常512ビット(64バイト)のブロックサイズでデータを処理します。このブロックサイズの情報は、ハッシュ関数の内部実装や、それを利用する上位のプロトコル(例:HMAC)にとって重要となる場合があります。

Go 1の設計者は、`hash.Hash`インターフェースに`BlockSize`メソッドを追加することで、ハッシュ関数のブロックサイズを明示的に取得できるようにし、これにより暗号ライブラリがより堅牢で効率的な実装を行えるようにしました。この変更は、既存の`hash.Hash`インターフェースを実装しているすべての型に影響を与えるため、Go 1への移行ガイドとしてドキュメントに追記されました。

## 前提知識の解説

### ハッシュ関数と`hash.Hash`インターフェース

Go言語の標準ライブラリには、ハッシュ関数を扱うための`hash`パッケージが提供されています。このパッケージの中心となるのが`hash.Hash`インターフェースです。

`hash.Hash`インターフェースは、以下のメソッドを定義しています(Go 1以前の定義):

-   `Write(p []byte) (n int, err error)`: 入力データをハッシュ関数に書き込みます。
-   `Sum(b []byte) []byte`: 現在のハッシュ値を計算し、`b`に追加して返します。
-   `Reset()`: ハッシュ関数の状態を初期化します。
-   `Size() int`: ハッシュ値のバイト数を返します。

ハッシュ関数は、通常、入力データを内部バッファに蓄積し、一定のブロックサイズごとに処理を進めます。例えば、MD5やSHA-1、SHA-256などの暗号学的ハッシュ関数は、入力データを512ビット(64バイト)や1024ビット(128バイト)といった固定長のブロックに分割して処理します。

### `BlockSize`の重要性

`BlockSize`は、ハッシュ関数が一度に処理する入力データの最小単位(ブロック)のサイズをバイト単位で示します。この情報は、特に以下のような場面で重要になります。

1.  **暗号学的利用**: HMAC (Keyed-Hash Message Authentication Code) のようなメッセージ認証コードの計算では、基となるハッシュ関数のブロックサイズがプロトコルの定義に不可欠です。`BlockSize`メソッドが提供されることで、HMACの実装は任意の`hash.Hash`実装に対して汎用的に動作できるようになります。
2.  **効率的なバッファリング**: ハッシュ関数を利用するアプリケーションやライブラリが、内部的にデータをバッファリングする際に、ハッシュ関数のブロックサイズを知ることで、より効率的なバッファ管理やパディング処理を行うことができます。
3.  **パディング処理**: 多くのハッシュ関数は、最後のブロックがブロックサイズに満たない場合に、特定のパディング処理を行います。`BlockSize`の情報は、このパディングロジックを正確に実装するために必要となることがあります。

Go 1で`BlockSize`が`hash.Hash`インターフェースに追加されたのは、これらの暗号学的および効率的な利用シナリオをサポートするためです。

## 技術的詳細

Go 1において、`hash.Hash`インターフェースに`BlockSize() int`メソッドが追加されました。これにより、`hash.Hash`インターフェースの定義は以下のようになりました(簡略化):

```go
package hash

type Hash interface {
    // Write adds more data to the running hash.
    // It never returns an error.
    io.Writer

    // Sum appends the current hash to b and returns the resulting slice.
    // It does not change the underlying hash state.
    Sum(b []byte) []byte

    // Reset resets the Hash to its initial state.
    Reset()

    // Size returns the number of bytes Sum will return.
    Size() int

    // BlockSize returns the hash's underlying block size.
    // The Write method must be called with input lengths that are
    // multiples of BlockSize.
    BlockSize() int // Go 1で追加
}

この変更により、既存のhash.Hashインターフェースを実装していたすべての型(例えば、crypto/md5crypto/sha1などのパッケージで提供されるハッシュ関数)は、新たにBlockSize()メソッドを実装する必要が生じました。

ドキュメントでは、この変更に対する既存の実装の更新方法について具体的に指示しています。

Updating: Existing implementations of hash.Hash will need to add a BlockSize method. Hashes that process the input one byte at a time can implement BlockSize to return 1.

これは、既存のhash.Hash実装がBlockSizeメソッドを追加する必要があることを明確に述べています。また、入力データを1バイトずつ処理するようなハッシュ関数(例えば、CRC32のような非暗号学的ハッシュ関数の一部)の場合、BlockSizeメソッドは1を返すように実装できることも示唆しています。これは、そのようなハッシュ関数が特定のブロックサイズを持たないか、あるいは任意のサイズの入力に対応できることを意味します。

暗号学的ハッシュ関数(MD5, SHA-1, SHA-256など)の場合、それぞれのアルゴリズムで定義された固定のブロックサイズ(例:MD5やSHA-1は64バイト、SHA-256は64バイト)をBlockSizeメソッドが返すように実装されます。

この変更は、Go 1の互換性保証の一部として、既存のコードベースが新しいインターフェース定義に準拠するための重要なステップでした。

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

このコミットは、Go 1のリリースノートを記述したHTMLファイルとテンプレートファイルに、hashパッケージに関するセクションを追加するものです。

変更されたファイルは以下の2つです。

  1. doc/go1.html
  2. doc/go1.tmpl

それぞれのファイルに、以下のHTMLスニペットが追加されています。

<h3 id="hash">The hash package</h3>

<p>
In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes
a new method, <code>BlockSize</code>.  This new method is used primarily in the 
cryptographic libraries.
</p>

<p>
<em>Updating</em>:
Existing implementations of <code>hash.Hash</code> will need to add a
<code>BlockSize</code> method.  Hashes that process the input one byte at
a time can implement <code>BlockSize</code> to return 1.
</p>

このスニペットは、doc/go1.htmlの686行目以降と、doc/go1.tmplの590行目以降に挿入されています。

コアとなるコードの解説

追加されたコードは、Go 1のリリースノートの一部として、hashパッケージの変更点を開発者に伝えるためのドキュメントです。

  • <h3 id="hash">The hash package</h3>: 「hashパッケージ」という見出しを作成し、このセクションがhashパッケージに関するものであることを示します。id="hash"は、このセクションへの直接リンクを可能にします。
  • <p>In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes a new method, <code>BlockSize</code>. This new method is used primarily in the cryptographic libraries.</p>: Go 1でhash.HashインターフェースにBlockSizeメソッドが追加されたことを説明しています。また、この新しいメソッドが主に暗号ライブラリで使用されることを明記し、その目的を示しています。/pkg/hash/#Hashへのリンクは、hash.Hashインターフェースの公式ドキュメントへの参照を提供します。
  • <p><em>Updating</em>: Existing implementations of <code>hash.Hash</code> will need to add a <code>BlockSize</code> method. Hashes that process the input one byte at a time can implement <code>BlockSize</code> to return 1.</p>: 既存のhash.Hash実装をGo 1に対応させるための具体的な更新手順を説明しています。既存の実装はBlockSizeメソッドを追加する必要があること、そして1バイトずつ処理するハッシュ関数はBlockSizeとして1を返すことができるというガイダンスを提供しています。これは、開発者がGo 1に移行する際に直面する可能性のある互換性の問題に対する直接的な解決策を提示しています。

このドキュメントの追加により、Go 1への移行を検討している開発者は、hash.Hashインターフェースの変更点とその対応方法を容易に理解できるようになりました。

関連リンク

参考にした情報源リンク