Goでsha256ハッシュするCLIをつくる


はじめに

与えられた文字列を SHA-256 でハッシュ化する CLI がほしかったので、Go で書いてみました。

コード

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"flag"
	"fmt"
	"os"
	"strings"
)

func main() {
	flag.Parse()
	args := flag.Args()
	if len(args) <= 0 {
		os.Stderr.WriteString("Please input text\n")
		return
	}

	result := sha256.Sum256([]byte(args[0]))
	fmt.Println(strings.ToUpper(hex.EncodeToString(result[:])))
}

標準ライブラリに用意されているcrypto/sha256を利用するだけで OK です。
string にキャストするとき、単純にstring(result)ではできないのでhex.EncodeTostringを使います。

実行結果

» sha256 test
9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08

第一引数にハッシュ化したい文字列を与えれば、ハッシュ化した値を返してくれます。単純。

ちなみに、Node で書くと

#!/usr/bin/env node

const { sha256 } = require("crypto-hash");

async function main() {
  if (process.argv.length <= 2) {
    console.error("Please input text");
    return;
  }

  const plaintext = process.argv[2];
  console.log(await sha256(plaintext));
}

main().catch(console.error);

crypto-hashというモジュールを使えばawait sha256("text")だけで OK。簡単。
とはいえ、ハッシュ化のちょっと面倒くさいコード部分をcrypto-hashが対応してくれているのです。

このモジュールに頼らずハッシュ化をする場合は以下のように書きます。

const crypto = require("crypto");

const sha256 = crypto.createHash("sha256");
sha512.update("text");
const hash = sha512.digest("hex");

読めばすぐに何をしているかはわかりますが、Go のほうがより直感的に感じます。

おわりに

Go は読みやすい。そして Node で実装したものと比べると、やはり実行速度が速い。