web-dev-qa-db-ja.com

単純な整数の代わりに長い文字列IDをいつ使用しますか?

例としてYoutubeを使用したいと思います。IDはPEckzwggd78の形式で使用しています。

なぜ彼らは単純な整数を使わないのですか?

またはimgur.com-画像やギャラリーに9b6tMZSなどのIDも使用します。連続した整数ではありません。

  • なぜ整数(特に連続した整数)を使用しないのですか?

  • どのような場合整数の代わりにそのような文字列IDを使用するのは賢明な決定ですか?

57
Rakori

Youtubeは、次の2つの理由で順次IDを使用できません。

  1. そのデータベースはほぼ確実に分散されており、連続番号付けが複雑になります。

  2. プライバシーオプション「限定公開動画」があります。検索結果には表示されませんが、IDがわかっている場合は利用できます。

したがって、ビデオIDはかなりランダムで予測できないものにする必要があります。 IDが数字のみで表されているか、文字と数字の組み合わせで表されているかは関係ありません。ある表現から別の表現への簡単なマッピングがあります。

101
IMil
  • IDの形式について:Base64を使用しています(a-zA-Z0-9-_)。これにより、1文字あたり6ビットの情報を持つことができます。 YouTubeは11文字の動画IDを使用しているため、2文字を生成できます6 * 11、または7 * 10以上19 ID。 Tom Scottによると ですが、これは「地球上のすべての人間が1分あたり約18,000年間、ビデオをアップロードするのに十分」です。 Base64は、64が2の累乗であるため、操作も簡単です。つまり、すべての文字が正確なビット数を表します。同じ理由で16進数(基数16)を使用します。

  • IDの非シーケンシャルな性質について:IDをビデオに割り当てるすべてのサーバー間で同期されたカウンターを必要としないことを意味します。彼らは単に乱数を生成し、それがすでに使用されているかどうかを確認し、そこから移動することができます。さらに、各サーバーにIDのブロックを割り当て、そこから選択して重複チェックを排除することもできます。彼らがそうしているかどうかはわかりませんが、できます。

  • 非順次IDのもう1つの理由は、「限定公開」の動画を機能させるためです。これらは、検索結果に表示されない、または候補として表示されない動画ですが、リンクを知っていればアクセスできます。シーケンシャルカウントを使用している場合は、動画に移動してIDを1つ増やすだけで、リストにない動画のアイデアが崩れます。

  • 非順次IDは、ビデオの総量や、時間枠ごとにアップロードされたビデオの数など、競合他社から情報を隠すのにも役立ちます。

私は強くお勧めできます Tom Scottのビデオ 。彼の情報はほとんど常に興味深く正確です。

75
rchard2scout
  • 整数はそれほどうまくスケーリングしません。「通常の」32ビット符号なし整数は、最大で40億を超えます。

  • 彼らはあなたが彼らがオンラインに持っているアイテムの数を知りたくないか、彼らが成長している率を追跡したくないかもしれません。

  • 文字は数字よりも多くの情報を保持できます。同じ「数」を表すのに必要な文字は少なくなります。大きなインデクサーデータベースの場合、これは追加される可能性があります。

13
Martin Maat

1)一部のWebサイトでIDに文字が使用されているのはなぜですか?それらはひもですか?

これらのWebサイトがIDをデータベースに文字列として保存するかどうかはわかりません。数字と文字列は、コンピュータにとってはまったく同じです。文字列は単なる数値であり、異なるベースで表示されます。 'A' = 0x41 = 65 = 0b1000001、コンピューターにとってはすべて同じです。しかし、それを表示すると、ベースが大きくなるほど、表現が短くなり、URLが短くなるため、人間にとって読みやすく、共有しやすくなります。 YouTubeやImgurなどのサイトでは、base 62(文字、大文字と小文字、および数字)またはそれ以上(ダッシュまたはその他の有効なURL文字を追加)を使用しています。何を使用しますか、youtu.be/23489234892348234933またはyoutu.be/B9k6KMrv8vh

2)連続しないIDが使用されるのはなぜですか?

IMilによる答え はそれをうまく説明しています:

Youtubeでは、次の2つの理由により、順次IDを使用できません。

  • そのデータベースはほぼ確実に分散されており、連番付けが複雑になります。

  • プライバシーオプション「限定公開動画」があります。検索結果には表示されませんが、IDがわかっている場合は利用できます。

これらは、IDが非常に大きい理由も説明します(YouTubeは23,489,234,892,348,234,933の異なるビデオをホストしていません)

  • IDを生成するとき、同じIDを誤って2回生成してしまうと問題になるため、防止するために大きなIDスペースが必要です 誕生日の問題

  • 特定の有効なIDがビデオに使用される可能性が非常に低い場合、人々はリストされていないビデオのURLを推測することができます。

8
Jasmijn

なぜ整数だけでなく、特に連続した整数ではないのですか?そして、どのような場合に、整数ではなくそのような文字列IDを使用するのが賢明なのでしょうか。

  • UTF-8スペースの改善-数値を文字列に変換すると、1文字あたり最大で10の組み合わせ(0〜9)が得られますが、英数字を許可すると、1文字あたり62の組み合わせ(az、AZ、0〜9)が得られます)、したがって、英数字文字列を使用することにより、数値文字列を使用する場合よりも短いURLを生成できます。これは、YouTubeやImgurなど、ユーザーがURLを共有しているサイトにとって重要です。
  • 連続した整数は生成がより困難です。順次増加する整数を生成するには、シングルスレッドで数値を生成するか、分散システムで多くのホストを調整する必要があります。また、ランダムに生成された文字列ほどうまくスケーリングしないYoutubeやImgurなどの大容量アプリケーションを実行する場合(言うまでもなくあるランダムに生成されます)

余談ですが、内部表現isが文字列であるとは限りません。彼らはおそらく、短い識別子の英数字文字列として数値識別子をエンコードしている可能性があります。

5
Samuel

あなたが指摘したように、内部ではすべてが01にすぎないため、数値を使用するだけでユニバーサルに一意のIDを使用するのは簡単であり、数値をより正確に拡張することができます128ビット以上。

主な理由は、uint32のような任意の固定範囲を想定すると(単なる例として)、文字も使用すると、全体でより短いIDを持つことができるためです。

それがURLの美的理由だと思います。文字付きの4,129,873,773を使用する代わりに、Fu837tははるかに短くなります(私が作成した架空のものです)。ユーザーは、友人に渡すためのURLを思い出すことさえできるかもしれません。 Youtubeのようなプラットフォームは、スペースがすぐになくなるため、通常32ビットよりも長いUUIDを持っています。

2
Ewald B.

リンクと共有が簡単になるため、短いURLが望ましい(たとえば、SMSでリンクを共有できる、入力するのが速いなど)。 YoutubeやImgurlなどのサービスでは、URLを気軽に共有してほしいので、これは重要な考慮事項です。

数値ではなく英数字のIDを使用すると、同じビットサイズのIDを表すのに必要な文字数が少なくなります。たとえば、6桁は100万の一意のIDを提供しますが、6つの英数字(base64セットを使用)は68 billion一意の識別子を提供します。

私たちが知っていることすべてのために、英数字の識別子は、base64のような英数字形式でエンコードされただけの連続番号である可能性があります。しかし、多くの場合、商用サービスはシーケンシャルコードを避けて、人々がIDを推測するのを防ぎ、顧客の数などのビジネス情報を開示しないようにします。

2
JacquesB

コンテンツハッシュ

「ハッシュ」という言葉は、既存のニースの回答には含まれていません。

多くの場合、データは、独立した人工的なIDではなく、コンテンツハッシュによって識別できます。これは、gitのようなソフトウェアやZFSのようなファイルシステムで特に顕著です。コンテンツハッシュを使用するこの特定のプロパティは、コンテンツを簡単に(たとえば、重複除外)するだけでなく、ささいなキャッシング、安全な履歴、ビットの腐敗の検出など.

ハッシュは通常、16進数(またはさらに大きな文字スペース)で表されるため、整数IDは表示されません。単にare整数はありません(これらの場合)。

データオブジェクトが不変の場合(ZFSやgitなど)、ハッシュは適切です。たとえば、大きなCDNに画像を保存するのに最適です。それらの特定のIDが実際にareハッシュであるかどうかはわかりませんが、それは確かに理にかなっています(そしてMichaelKjörlingがコメントしたように、short IDはおそらく明らかな理由でハッシュではありません-比較では、gitは20バイトまたは40桁の16進数であるSHA-1値を使用します。

1
AnoE

数値以外のIDを使用する理由はいくつかありますが、アルファベット文字を含むすべての値が実際に文字列であるとは限らないことも理解してください。 YouTubeには、毎分300時間程度のビデオがアップロードされるという、信じられないほど多くのビデオの評判があります( ref )。これらのビデオを表す一意の整数はかなり長くなる可能性があるため、Base64 URLエンコードされた数値( ref )などを使用します。

識別子表現のタイプ:

  • 単純な整数:(12345、981027489382493)
  • 16進整数:123456789abcdef-Hexとも呼ばれます
  • Base 64整数:9b6tMZS
  • 読み取り可能な文字列:12032017-Read-my-awesome-article-01

彼らには長所と短所があります。識別子に使用できる一意の文字が多いほど、数値を表すために必要な文字が少なくなります。ベース64の数値は、URLに対して機能し、数値を表すために必要な文字数を6から8に圧縮する(つまり、サイズの3/4)確立されたバリアントがあるため、かなり良い妥協案です。

読みやすい文字列は、検索可能性を高めることができるため、ブログで機能します。また、レコード数が少ない場合は、一意のタイトルを生成する方がはるかに簡単です。

1
Berin Loritsch

理由の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文字は可能です。

魔法の数7

0
Pieter B