Web アプリケーションでは、レコード ID をランダム化します。その理由は、DB に既にいくつのエントリが存在するかを非表示にしたいためであり、リストにないものがあるためです。ID が単純な増分番号である場合、リストにないものの ID を推測するのは簡単です。
私が見たところ、これを行うには3つの方法があります。
単純な乱数
アルゴリズム:
- 挿入時に乱数を作成します。
- ID がすでに使用されているかどうかを確認します。はいの場合は 1 に進みます。
- この ID を使用します。
プロ
- 簡単
- ID の任意のサイズまたはタイプ (32 ビット、64 ビット、可変長、文字列) で動作します
コントラ
- 競合状態の可能性があるため、トランザクションが必要です (アルゴリズムはアトミックではありません)。
UUID
プロ
- 衝突の可能性は非常に低いため、無視できます
コントラ
- URL コメント (
"#{id}--#{page_title}
) としてページ タイトルを含む素敵な短い URL が必要な場合、UUID を使用すると、このコメントが右端まで移動します。 - 主キーとしてのUUIDは、結合のパフォーマンスが低下すると思いますか?
暗号化された ID
アルゴリズム:
nextval
(atomic!)を使用してシーケンスから数値を読み取る- 秘密鍵と、ID に使用されるサイズで動作する暗号化アルゴリズムを使用して ID を暗号化します。
プロ
- 競合状態なし (トランザクションは不要)
コントラ
- ID 列のサイズは決して変更できません
- 誰かが鍵を解読/推測できれば、すべてが無駄だった
タイムスタンプ
@emboss の提案
プロ
- 簡単
- IDが不足することはありません
コントラ
- 衝突が発生する可能性があります(ただし、実際に発生するかどうかをテストする必要があります)
- 多分ある程度推測できる
ランダム パブリック ID/名前ベースのパブリック ID
@viktor tron の提案
レコードを検索するためにのみ使用される、URL で発生するすべてのものの 2 番目の ID。内部的には通常の ID が使用されます (結合など)。
プロ
- 内部的にはすべて正常なままです
- 適切なランダム アルゴリズム/命名スキームにより、URL の推測が (十分に) 不可能になるはずです。
コントラ
- パブリック インターフェイスで ID を使用する多くの変更
- ユーザーは、そのようなタイトルを含む URL を削減できると考えるかもしれませんが、この場合、URL は機能しなくなります。
3番目のオプションを使用すると思います。それとも、それに対するより多くの議論がありますか? さらに良い解決策はありますか?Ruby on Rails 3.x と PostgreSQL 9.x を使用しています。
編集:非公開は非公開を意味しません!YouTube の限定公開動画のようなものです。検索結果やアップローダーのプロフィールに表示されない通常の動画です。そのため、(考えられるすべての ID を試してみないと) 実際にそれらを見つけることはできませんが、URL を知っている人なら誰でもそれらにアクセスできます。もちろん、何かを非公開にし、リンクを他の誰かに送信するユーザーは、それが不明なままではない可能性があることに注意する必要があります (URL が渡され、リンクによって検索エンジンにたどり着く可能性があります)。
物事を非公開にする別のオプションもあります。これらは2つの異なるものです。(「非公開」の意味を誰もが知っていると仮定するのは間違いだと思います。)