Edited at

GoでSecureRandomを使いたい

More than 3 years have passed since last update.

Rubyの以下のコード

require 'securerandom'

puts SecureRandom.hex(16)

をGoに移植したいと思ったとします。すると以下のようになります。

package main

import (
crand "crypto/rand"
"fmt"
)

func secureRandomStr(b int) string {
k := make([]byte, b)
if _, err := crand.Read(k); err != nil {
panic(err)
}
return fmt.Sprintf("%x", k)
}

func main() {
fmt.Println(secureRandomStr(16))
}

なんでこんな話をするのかというと、以前移植する機会があったんですね。

Ruby実装は SecureRandom.hex(16) と書いてあるだけでした。実はRubyのコードもGoのコードも自分が書いたのですが、Rubyで何も考えずに書いたコードがこんなに長くなるのか!って感じで(他にも色々あって)移植作業は予想以上に大変でした。

こういう風にRubyだと1行だけど、Goだと色々しないといけないといけないみたいなパターンが色々あるので、色んな言語で実装する必要があるWebアプリケーションを実装するときは気を付けましょう、という話でした(まあ自分が悪い)。