golangで2chのIDを生成したい


<https://code.jp.ai/question/155>

上記のサイトを参考にしてIDを生成したいと考えているのですが、Goではどのように実装すれば良いのでしょうか。

考えてみましたが、`md5.Sum(ip)`は`[16]byte`型なので`[:30]`のようにスライスできません。  
golangにもPHPの`substr`のような関数があれば良いのですが、見つかりませんでした。

どのように実装できるかご教授ください。




  * md5ハッシュは16バイト長であると規格で定められています（ただし1バイトを8ビットとします）。 
    * PHPの`md5()`はそれを16進表記に直し、32文字にしています([参考](http://php.net/manual/ja/function.md5.php))。
    * Goの`md5.Sum()`は[]byte型のまま結果が得られます([参考](https://golang.org/pkg/crypto/md5/#Sum))。
  * Goで[]byte型を16進数の文字列に変換したい場合、`fmt.Sprintf`が使えると思います。`%x`や`%X`フォーマットが使えます。 
    * あるいは、`hex.EncodeToString` でも良さそうです([参考](https://golang.org/pkg/encoding/hex/#EncodeToString))。ただしarrayとsliceの違いにご注意ください([参考](https://stackoverflow.com/questions/28886616/convert-array-to-slice-in-go))。
  * 部分文字列は、Unicodeのことを考えると簡単には実装できないことが分かります。そのためGoでは、string型、[]byte型、[]rune型を上手く使い分けています。詳しくは [  
"Strings, bytes, runes and characters in Go - The Go
Blog"](https://blog.golang.org/strings) を見て下さい。

    * 入力される文字列が1バイト文字に限られているのであれば、string型の変数`s`に対して単に`s[i:j]`とすると部分文字列が得られます。
    * そうでない場合は、一旦[]rune型にキャストして操作すると良いです。たとえば`string([]rune(s)[i:j])`といった具合です。
  * 今回の場合に限れば、最初の、[]byte型のハッシュ値の時点で部分列をとる方が簡単です。




  * md5ハッシュは16バイト長であると規格で定められています（ただし1バイトを8ビットとします）。 
    * PHPの`md5()`はそれを16進表記に直し、32文字にしています([参考](http://php.net/manual/ja/function.md5.php))。
    * Goの`md5.Sum()`は[]byte型のまま結果が得られます([参考](https://golang.org/pkg/crypto/md5/#Sum))。
  * Goで[]byte型を16進数の文字列に変換したい場合、`fmt.Sprintf`が使えると思います。`%x`や`%X`フォーマットが使えます。 
    * あるいは、`hex.EncodeToString` でも良さそうです([参考](https://golang.org/pkg/encoding/hex/#EncodeToString))。ただしarrayとsliceの違いにご注意ください([参考](https://stackoverflow.com/questions/28886616/convert-array-to-slice-in-go))。
  * 部分文字列は、Unicodeのことを考えると簡単には実装できないことが分かります。そのためGoでは、string型、[]byte型、[]rune型を上手く使い分けています。詳しくは [  
"Strings, bytes, runes and characters in Go - The Go
Blog"](https://blog.golang.org/strings) を見て下さい。

    * 入力される文字列が1バイト文字に限られているのであれば、string型の変数`s`に対して単に`s[i:j]`とすると部分文字列が得られます。
    * そうでない場合は、一旦[]rune型にキャストして操作すると良いです。たとえば`string([]rune(s)[i:j])`といった具合です。
  * 今回の場合に限れば、最初の、[]byte型のハッシュ値の時点で部分列をとる方が簡単です。

