Sqidsは数値から短く、ユニークでランダムな見た目のIDを生成できる小さなオープンソースライブラリです。
これを考える最良の方法は、10進数から16進数への変換機と同じように考えることですが、いくつかの追加機能があります。
リンクの短縮、ログのための一意のイベントIDの生成、ウェブサイト上の製品/オブジェクトのIDの生成(YouTubeが動画に対して行うような)、テキストメッセージのための短いID、メールの確認コードなど。
機密データ以外のすべてのデータ。生成されたIDはハッシュではなく、数値に戻すことができます。たとえば、ユーザーIDには適していないかもしれません。なぜなら、デコードされるとアプリのユーザー数が明らかになる可能性があるからです。
はい。Sqidsは1つまたは複数の非負の数値を1つのIDにエンコードできます。エンコードできる数値の数に制限はありませんが、エンコードできる数値の大きさには制限があります(実装言語による)。
これはいくつかの理由で役立ちます:UNIXタイムスタンプをエンコードして有効期限のあるIDを作成したり、データベースのシャード番号をプライマリキーと一緒にエンコードして余分なデータベースクエリを節約したりできます。
はい、生成されたIDは入力とアルファベットに固有です。
ただし、デフォルトのアルファベットには大文字と小文字の両方が含まれているため、デフォルトのIDは大文字と小文字を区別します。
Sqidsは負の数をエンコードできません。
アルファベットの最小の長さは3文字です。
アルファベットにマルチバイト文字を含めることはできません。
Sqidsは特定の長さまでIDを生成することはできません、最低でも特定の長さまでです。最小長のパラメータ範囲は0から255です。
Sqidsはアルファベットの長さ-1までIDを再生成しようとします。
ライブラリはカスタムのアルファベットを受け入れ、それを元にIDを生成します。提供されたデフォルトのアルファベットを事前にシャッフルするだけです。
多少の努力を惜しまなければ、誰かがシャッフルされたアルファベットを逆エンジニアリングできる可能性があるため、これは機密データを隠すための手段ではありません。
使用状況によります。短いアルファベットはより長いIDを生成し、長いアルファベットはより短いIDを生成します。プレイグラウンド を使用して、IDの見た目をテストできます。
はい、生成されたIDはまだ文字列であり、ゼロから始まることがあります。
いいえ、Sqidsはアルファベットにマルチバイト文字をサポートしていません。これには絵文字やその他の多くの文字も含まれます。
ライブラリはIDに不要な文字を追加して長く見せることができます。これは、1のような小さな数値をエンコードしているのか、1000000のような大きな数値をエンコードしているのかが明らかでないようにするために便利です。
デコードには影響しません。
はい、ライブラリは最小長のパラメータを受け入れます。IDはその長さ以上になることを保証します。
IDの長さは保証されません。指定した長さより短くならないだけです。
一定の範囲までです。
十分な入力があれば、いずれはIDがオーバーフローするため、最大長を設定することは不可能です。そのため、最小長のパラメータのみがサポートされており、正確な長さまたは最大長はサポートされていません。
ブロックリストは特定の単語がIDに表示されるのを防ぐことができます。これは生成されたIDがURLなどの公共の場所に表示されることを意図しているため、有益です。
Sqidsには、いくつかの言語から最も基本的な卑猥な単語と不適切な単語を含むデフォルトのブロックリスト が付属しています。もちろん、独自の単語でそのブロックリストを拡張することもできます。
ブロックリストの単語の照合は大文字と小文字を区別しません。
3文字以下の短い単語はブロックされません。3文字の単語はIDと完全に一致する必要があります。4文字以上の単語は、IDの部分文字列と一致するとトリガーされます。
ブロックリストの単語に数字(leetspeak)が含まれている場合、それらはIDの先頭または末尾にある場合のみトリガーされます。
デフォルトのブロックリストにはいくつかの言語から最も一般的な卑猥な単語と不適切な単語が含まれています。完全なリストはこちら からご覧いただけます。
生成されたIDがブロックリストの単語に一致する場合、ライブラリは再生成を試みます。
すべての試行が失敗した場合、エンコード関数は失敗し、エラーを返します。そのエラーの処理はユーザーに委ねられます。
再生成試行の数を減らす最良の方法は、より長いアルファベットを持ち、最小長を設定せず、小さなブロックリストを提供することです。空のブロックリストを提供すると、この機能は完全に無効になります。
IDをデコードすると通常、数値の出力が得られますが、それが必ずしも正規のIDであることを意味するわけではありません。IDが正当であるかどうかを確認するには、デコードされた数値を再エンコードしてIDが一致するか確認できます。
これが自動的に行われない理由は、将来、デフォルトのブロックリストが変更された場合に、過去に生成されたIDを自動的に無効にしたくないためです。
デフォルトのブロックリストが変更された場合、私たちは確実にCHANGELOGを更新します。
デフォルトのブロックリストに新しい単語が追加される可能性があるシナリオに対応する必要があります。この場合、数値を再エンコードすると異なるIDが生成されるかもしれません。
将来の更新全体でIDが一貫していることを確認する最良の方法は、現在のデフォルトのブロックリストと同一の独自のブロックリストを提供することです。
いいえ、異なる数値をエンコードしても一意のIDが生成されます。
ただし、アルゴリズムの設計上、ランダムなIDをデコードすると同じ数値が生成されることがあります。IDが正規であるかどうかを確認する最良の方法は、単純にデコードされた数値を再エンコードしてIDが一致するか確認することです。
Hashidsはこのライブラリの最初のバージョンで、2013年頃にリリースされました。少し異なる方法で短いIDを生成しました。
Hashidsはいくつかの点で異なる方法で扱われていました。
カスタムブロックリストをサポートしておらず、代わりに最も一般的な英語の卑猥な単語に頼っていました。また、saltパラメーターを使用してアルファベットをシャッフルしていましたが、これはライブラリが暗号化とは関係ないため、少し混乱を招いていました。さらに、長いIDを生成する結果になるような予約済みの文字を多用していました。
そのため、アルゴリズムを簡素化し、いくつかの機能を追加し、コードリポジトリをすべてこちら に統合することにしました。
saltパラメーターはアルファベットをシャッフルするために使用されましたが、セキュリティや安全性に関連するものではありませんでした。HashidsとSqidsの両方が、10進数から16進数への変換のように似たような方法で動作しますが、何らかの暗号化は行われていません。そのため、そのパラメーターは完全に削除されました。
いいえ、SqidsはHashidsの機能を拡張し、異なる設計目標と要件を持っています。そのため、生成されたIDはHashidsと互換性がありません。
HashidsとSqidsの間に互換性がないため、HashidsをSqidsに単純に置き換えることは不可能です。
ただし、異なるライブラリのIDを区別することで両者を統合することができます。
その1つの方法は、IDの長さです。Sqidsに切り替える場合、より高い最小長を指定できます。別の方法は、新しく生成されたIDに手動でカスタム文字を追加することです。
最後に、HashidsでIDをデコードして有効かどうかを確認することもできます。もし有効でない場合は、デコードしてSqidsで再エンコードしてみてください。
このウェブサイトの各言語実装は、元のHashidsリポジトリへのリンクがあればリンクしています。
プロジェクトをサポートしていただける場合は、Github上で私たちのリポジトリにスターを付けていただけると助かります。
特定の言語の実装がない場合は、Sqidsのライブラリを変換するのを手伝ってください。同様に、リストされていないプログラミング言語にも適用されます。
仕様または実装にバグがある場合は、適切なリポジトリに提案された修正案とともに問題を作成するかプルリクエストを作成してください。
複数の言語を話せる場合、ブロックリストの微調整 やウェブサイトの翻訳の調整でお手伝いいただけると助かります。
最後に、Hashids/Sqidsについての経験がある場合は、コミュニティを導いていただくために質問に回答していただけると助かります。