カテゴリー
ツール

hashids – 自然数からか逆なユニークidを生成する多言語に対応したライブラリ

Hashids は、0または正の数をアルファベット+数字の短い並びに変換し、また逆変換で元の数を取り出すことができるライブラリです。

YouTubeの動画ページのURLについている、動画と一対一にマッチした文字列や、bit.ly などのURL転送サービスでURLごとに生成される文字列のような、一意に決まってなるべく短い文字列を作るという目的で作られたそうです。

サイトのトップに列挙されているのですぐにわかりますが、非常に多くのプログラミング言語に移植されています。

JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, Bash, R, TSQL, PostgreSQL, PLpgSQL, Dart, Io, Julia, .NET

Rails, Django, WordPress, など言語だけでなくフレームワークやCMSのプラグインも作られていて、多くの言語や環境を超えて生成されたunique id を渡して取り出すこともできそうです。双方向の変換ができますが、ソルトを与えることで変換結果は個々に違わせることができます。
w
昨日のワードフィルタに関する Hacker News の議論で出てきたのでこのライブラリを知ったのですが、このライブラリの十分にコンパクトな仕様の中で面白いと思ったのは、このユニークな文字列の生成時に「よくある英語の卑語が出てこないようにする」ための方法がドキュメントに大きく書いてあることですね。

ユニークな文字列の生成時に、c, s, f, h, u, i, t の文字が連続して並ばないように指定することで、システムが自動的に作ったユニークidの中に英語のマズイ単語が偶然出てくることを防げることが多い、そうです。経験的なものでしょうけどそんなハックがあるんですね。hashid の変換関数ではセパレータとしてこれらの文字を与えることで、セパレータ同士が隣接しないようにできます。これによって使えない文字列が相当数出てしまいユニークidも少し長くなってしまうでしょうけれど、ユニークidに偶然卑語が出るとよくない、と思うサービス開発者も多いのかもしれません。