Go by Example: SHA1 Hashes

SHA1 ハッシュ は、バイナリやテキストのかたまりに対して短い ID を計算するのによく使われます。例えば、 Git バージョン管理システム は バージョン管理されるファイルやディレクトリを識別するために、 SHA1 を広範囲にわたって使用しています。 以下は、Go で SHA1 ハッシュを計算する方法です。

package main

Go は様々な crypto/* パッケージで、 複数のハッシュ関数を実装しています。

import (
    "crypto/sha1"
    "fmt"
)
func main() {
    s := "sha1 this string"

ハッシュを生成するパターンは、sha1.New() の次に sha1.Write(bytes)、そして sha1.Sum([]byte{}) です。以下では、ハッシュの生成から始めます。

    h := sha1.New()

Write はバイト列を受け取ります。文字列 s がある場合は、 []byte(s) を使って強制的にバイト列にします。

    h.Write([]byte(s))

バイト型のスライスとして最終的なハッシュ値を取得します。 Sum への引数は、既存のバイト型スライスへハッシュ値を 追記したい場合に使えますが、通常は必要ありません。

    bs := h.Sum(nil)

例えば Git のコミットなど、SHA1 値はよく 16 進数で表示されます。ハッシュ値を 16 進文字列に変換するには、 %x フォーマット指定子を使ってください。

    fmt.Println(s)
    fmt.Printf("%x\n", bs)
}

プログラムを実行すると、ハッシュが計算され、 人間が読める 16 進フォーマットで表示されます。

$ go run sha1-hashes.go
sha1 this string
cf23df2207d99a74fbe169e3eba035e633b65d94

先に説明したのと同様のパターンを使って、他のハッシュも計算できます。 例えば、MD5 ハッシュを計算するには、crypto/md5 をインポートして md5.New() を使います。

暗号論的に安全なハッシュが必要な場合には、 ハッシュの強度 を注意深く調査すべきである点に注意してください!

Next example: Base64 Encoding.