【Golang】Base62 に標準ライブラリで変換する【Base16 → Base62 のハッシュ値取得】


Go 言語(以下 Golang)で、ハッシュ値の HEX 文字列を Base62 でエンコードしたい

つまり ハッシュ値を Base16(16進数)でなく Base62(62進数)の文字列にして圧縮させることで、短くさせつつもコリジョンハッシュ値の衝突の可能性をなるべく和らげたいのです。

「"golang" base62 変換」でググっても、外部ライブラリを使う方法ばかりだったので自分のググラビリティとして。

TL; DR (今北産業)

  1. Go 標準モジュールの math/big パッケージを使う。

  2. big.Int 型には Text(n) 関数があり n 進数指定できる。
    62 進数の場合は、10 進数の 0〜9 --> 0-910〜35 --> a-z36〜61 --> A-Z を使い、合計 62 文字で Int を表現する。

  3. マスター、動くものをくれ。

    BLAKE3アルゴリズムのハッシュ値を16進数&62進数で表示する例
    import (
    	"fmt"
    	"math/big"
    
    	"github.com/rs/xid"
    	"lukechampine.com/blake3"
    )
    
    func main() {
    	// ハッシュ化したいデータ
    	in := "Hello, 世界"
    
    	// UID(ユニークな ID)作成
    	salt := xid.New().String()
    
    	// ハッシュ化(BLAKE3)
    	hashed := blake3.Sum256([]byte(in + salt))
    
    	// 16進数
    	fmt.Printf("Base16: %x\n", hashed)
    
    	// 62進数
    	var i big.Int
    	i.SetBytes(hashed[:])
    
    	fmt.Println("Base16:", i.Text(16))
    	fmt.Println("Base62:", i.Text(62))
    }
    // 下記出力は UID により毎回変わります
    // Output:
    // Base16: 87c1be7ba47cb8f482e2c69b004b56abd80ec96692388a23833835ea0694cc66
    // Base16: 87c1be7ba47cb8f482e2c69b004b56abd80ec96692388a23833835ea0694cc66
    // Base62: wbUvWQuw8izQ52BxuEy9GPb06r2scZjnCMmOVIr1ds2
    
    • オンラインで動作をみる @ Go Playground
    • 【注意】元データの頭が 0 で始まる場合は変換時にトリムされてしまうので、ハッシュ値を固定長の文字列として Base62 で欲しい場合は注意します。

参考文献