Youtubeを例として使用したいと思います。彼らはの形式のIDを使用しますPEckzwggd78
。
単純な整数を使用しないのはなぜですか?
またはimgur.com- 9b6tMZS
画像やギャラリーなどのIDも使用します。連続した整数ではありません。
なぜ整数(特に連続した整数)を使用しないのですか?
どのような場合、整数の代わりにそのような文字列IDを使用することが賢明な決定ですか?
Youtubeを例として使用したいと思います。彼らはの形式のIDを使用しますPEckzwggd78
。
単純な整数を使用しないのはなぜですか?
またはimgur.com- 9b6tMZS
画像やギャラリーなどのIDも使用します。連続した整数ではありません。
なぜ整数(特に連続した整数)を使用しないのですか?
どのような場合、整数の代わりにそのような文字列IDを使用することが賢明な決定ですか?
回答:
YouTubeでは、次の2つの理由でシーケンシャルIDを使用できません。
そのデータベースはほぼ確実に分散されており、連番は複雑になります。
プライバシーオプション「限定公開動画」があります。検索結果には表示されませんが、IDがわかっていれば利用できます。
そのため、ビデオIDは適度にランダムで予測不可能でなければなりません。IDが数字のみで表されるか、文字と数字の組み合わせで表されるかは関係ありません。ある表現から別の表現への簡単なマッピングがあります。
2^40
アイテムを保存するだけでよいと推定される場合、一部のアーキテクチャでは、1 2^80
つまたは複数のスペースを選択する正当な理由があり2^120
ます。理由の例:技術的に衝突をチェックせずに衝突を減らす。秘密を見つけにくくするための一部としてキーのまばらさを使用する(「非公開ビデオ」)など
IDの形式について:(文字を使用して、彼らは、Base64を使用しているa
- 、z
- A
、Z
- 0
、9
、-
および_
)。これにより、文字ごとに6ビットの情報が得られます。YouTubeは11文字の動画IDを使用します。つまり、2 6 * 11、または7 * 10 19を超えるID を生成できます。トム・スコットがそれを置く、それは「地球上のすべての単一の人間が周りの18,000年間のビデオ毎分をアップロードするための十分な。」です 64は2の累乗であるため、Base64も簡単に操作できます。つまり、すべての文字は正確なビット数を表します。同じ理由で、16進数(基数16)を使用します。
IDの非シーケンシャルな性質については、ビデオにIDを割り当てるすべてのサーバー間で同期カウンターが不要であることを意味します。乱数を生成し、既に使用されているかどうかを確認して、そこから進むことができます。さらに、各サーバーにIDのブロックを割り当てて、重複チェックを選択して排除することもできます。彼らがそれをやっているかどうかはわかりませんが、可能です。
非シーケンシャルIDのもう1つの理由は、「限定公開」動画が機能する理由です。これらは、検索結果や提案として表示されない動画ですが、リンクがあればアクセスできます。シーケンシャルカウントを使用している場合は、ビデオに移動してIDを1つ増やすだけで、リストにないビデオのアイデアは失われます。
非シーケンシャルIDは、ビデオの合計量や時間枠ごとにアップロードされたビデオの数など、競合他社から情報を隠すのにも役立ちます。
トム・スコットのビデオを強くお勧めします。彼の情報はほとんど常に興味深く正確です。
整数はそれほどスケーリングしません。「通常の」32ビット符号なし整数は、40億をわずかに超えます。
彼らは、あなたが彼らがオンラインで持っているアイテムの数を知りたくないか、彼らが成長している率を追跡したくないかもしれません。
文字は数字よりも多くの情報を保持できるため、同じ「数字」を表すのに必要な文字は少なくなります。大きなインデクサーデータベースの場合、これは合計される可能性があります。
1)一部のWebサイトのIDに文字が使用されているのはなぜですか?彼らは文字列ですか?
これらのWebサイトがデータベースにIDを文字列として保存しているかどうかはわかりません。数字と文字列はコンピューターと同じです。文字列は単なる数字で、異なる基数で表示されます。'A' = 0x41 = 65 = 0b1000001
、コンピューターにとってはすべて同じです。ただし、表示する場合、ベースが大きいほど、表現が短くなり、URLが短くなり、人間にとって読みやすく共有しやすくなります。YouTubeやImgurなどのサイトでは、ベース62(文字、大文字と小文字、プラス数字)以上(ダッシュまたはその他の有効なURL文字を追加)を使用しますが、これは大きな数字には比較的短いです。何を使いたいですyoutu.be/23489234892348234933
かyoutu.be/B9k6KMrv8vh
?
2)連続していないIDが使用される理由
IMilの答えはそれをうまく説明しています。
YouTubeでは、次の2つの理由でシーケンシャルIDを使用できません。
そのデータベースはほぼ確実に分散されており、連番は複雑になります。
プライバシーオプション「限定公開動画」があります。検索結果には表示されませんが、IDがわかっていれば利用できます。
これらは、IDが非常に大きい理由も説明しています(YouTubeは23,489,234,892,348,234,933の異なるビデオをホストしていないことは明らかです)
People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.
-リストにない動画に、その作者以外の誰もがアクセスできない場合、どうやって知るのですか?他の誰かがそのIDを推測したとしても
なぜ整数、特に連続した整数ではないのですか?そして、どのような場合に整数ではなくそのような文字列IDを賢明に決定するのですか?
余談ですが、内部表現が文字列であるとは限りません。短いURLの英数字文字列として数値識別子をエンコードしている可能性が非常に高いです。
あなたが指摘したように、フードの下ではすべてが公正で0
あり1
、128ビット以上までさらに正確に番号を拡張できるため、数字を使用するだけで普遍的に一意のIDを使用するのは簡単だと指摘しました。
主な理由は、uint32
(例だけのために)のような任意の固定範囲を仮定して、文字を使用する場合、合計でより短いIDを持つことができるからだと思います。
これがURLの審美的な理由だと思います。4,129,873,773
文字を使用する代わりに、はるかに短くなりますFu837t
(私が作成した架空のものです)。ユーザーは、URLを覚えて友人に渡すことさえできます。Youtubeのようなプラットフォームは、スペースがすぐになくなるため、通常32ビットより長いUUIDを持っています。
短いURLが望ましいのは、リンクと共有が簡単になるためです(たとえば、SMSでリンクを共有できる、入力するのが速いなど)。YoutubeやImgurlなどのサービスでは、URLを気軽に共有してほしいので、これは重要な考慮事項です。
数値ではなく英数字のIDを使用すると、同じビットサイズのIDを表すのに必要な文字が少なくなります。たとえば、6桁で100万の一意のIDが得られますが、6文字の英数字(base64セットを使用)では、680 億の一意の識別子が得られます。
私たちが知っている限りでは、英数字の識別子は連続した数字で、base64のような英数字形式でエンコードされているだけです。しかし、多くの場合、商用サービスは、人々がIDを推測するのを防ぎ、顧客の量などのビジネス情報の開示を避けるために、シーケンシャルコードを使用しません。
非数値IDを使用する理由はいくつかありますが、アルファベット文字の値がすべて文字列ではないことも理解しています。YouTubeには、毎分300時間程度のビデオがアップロードされるという信じられないほどの数のビデオがあるという評判があります(ref)。これらのビデオを表す一意の整数は非常に長くなる可能性があるため、Base64 URLエンコードされた数字(ref)のようなものを使用します。
識別子表現の種類:
それらはすべて長所と短所を持っています。識別子に使用できる一意の文字が多いほど、数字を表すのに必要な文字が少なくなります。Base 64の数字は、URLで機能し、数字の6から8(つまりサイズの3/4)を表すために必要な文字数を圧縮する確立されたバリアントがあるため、かなり良い妥協案です。
可読性のある文字列は、検索性を高めることができるためブログで機能し、レコード数が少ない場合に一意のタイトルを生成する方がはるかに簡単です。
「ハッシュ」という言葉は、既存の素敵な答えにはないので、ここに行きます。
多くの場合、データは、独立した人工的なIDではなく、コンテンツハッシュによって識別できます。これはgit
、コンテンツハッシュを使用するこの特定のプロパティが物事を簡単にするだけでなく(重複除外など)、単純なキャッシング、安全な履歴、ビット腐敗の検出などの他の優れたプロパティを持つZFSのようなソフトウェアやファイルシステムで特に顕著です等
ハッシュは通常16進数(またはさらに大きな文字スペース)であるため、整数IDが表示されないのはこのためです。単純にありません(これらのケースでは)何の整数。
ハッシュは、データオブジェクトが不変(ZFSやgit
)の場合に適しています。たとえば、大きなCDNに画像を保存すると便利です。それらの特定のIDが実際にハッシュであるかどうかはわかりませんが、それは確かに理にかなっています(そしてMichaelKjörlingがコメントしたように、短い IDはおそらく明らかな理由でハッシュではありません-比較として、gitは20バイトまたは40のSHA-1値を使用します16進数)。
hashCode()
などです。もちろん、ハッシュ、ランダム衝突の可能性が高くなります。
理由の1つは、文字が整数としてではなく文字として送信されることです。これは、HTTP Getが機能するためです。
「整数を使用しない理由」と言うとき さて、整数が切り取られ、すべての数字が文字として送信されると、とにかく文字列になります。それでは、キャラクターのすべてのオプションを使用しないのはなぜですか?
人的要因もあります。
例えば、imgurを使用してください:https : //imgur.com/ ***** / s6UqP
s6UqP、
すべての文字の範囲は、a〜zの大文字、a〜zの副大文字、および文字列内のすべての位置の0〜9 = 26+ 26+ 10 = 62オプションです。5つのポジションで916132832の組み合わせが可能です。数字のみを使用する場合は、9桁が必要です。
人々は約7個のオブジェクトをメモリに保持できます。9桁は多すぎます。5文字は実行可能です。