【Golang】Base62 に標準ライブラリで変換する【Base16 → Base62 のハッシュ値取得】
Go 言語(以下 Golang)で、ハッシュ値の HEX 文字列を Base62 でエンコードしたい。
つまり ハッシュ値を Base16(16進数)でなく Base62(62進数)の文字列にして圧縮させることで、短くさせつつもコリジョンの可能性をなるべく和らげたいのです。
「"golang" base62 変換」でググっても、外部ライブラリを使う方法ばかりだったので自分のググラビリティとして。
- ハッシュ?コリジョン?BLAKE3? 👇
- 最速のDBキー検索を求めて with SQLite3 | ハッシュ関数の基本と応用 @ Qiita
TL; DR (今北産業)
-
Go 標準モジュールの
math/big
パッケージを使う。 -
big.Int
型にはText(n)
関数がありn
進数指定できる。
62 進数の場合は、10 進数の0〜9
-->0-9
、10〜35
-->a-z
、36〜61
-->A-Z
を使い、合計 62 文字でInt
を表現する。 -
マスター、動くものをくれ。
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 で欲しい場合は注意します。
参考文献
- hashアルゴリズムとハッシュ値の長さ一覧 @ Qiita
- Int.Text() | Go v1.17.8 @ pkg.go.dev
- Multibase format | multiformats @ GitHub
- Multihash format | Multiformats @ multiformats.io
Author And Source
この問題について(【Golang】Base62 に標準ライブラリで変換する【Base16 → Base62 のハッシュ値取得】), 我々は、より多くの情報をここで見つけました https://qiita.com/KEINOS/items/0ccf262966866d4f2611著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .