サンプルで学ぶ Go 言語:SHA1 Hashes

SHA1 ハッシュ関数はバイナリや文字列の短い識別子を計算するためによく使う。 例えばバージョン管理システムである Git ではファイルやディレクトリを識別するために SHA1 を使っている。 それでは、Go で SHA1 を計算する例を見ていこう。

package main

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)

SHA1 のハッシュ値は、Git がそうしているように、16進記数法で表示することが多い。 フォーマット文字列に %x と書けば、ハッシュ計算の結果を16進文字列に変換できる。

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

プログラムはハッシュ値を計算し、人が読みやすい16進記数法で結果を表示する。

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

上と同様のやり方で他のハッシュ関数を計算することもできる。 例えば MD5 ハッシュ関数を使いたければ、 crypto/md5 をインポートして md5.New() を使えばよい。

ただし、暗号学的に安全なハッシュ関数を使いたい場合には ハッシュ関数の強度について知る必要がある。

次の例:Base64 Encoding