単純な整数ではなく、長い文字列IDをいつ使用しますか?[閉まっている]


54

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

単純な整数を使用しないのはなぜですか?

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

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

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


47
IDが単なる整数ではないことを信じる理由は何ですか?DBで整数を使用する多くのWebサービスを知っていますが、base64エンコーディングで表示するため、URLは見栄えがよくなります。興味深いことに、YouTube IDは64ビット整数にほとんどマッピングされます。
ヨーゼフ

2
@rwongしかし、OPの質問は、数値IDを使用しない理由であり、答えは次のとおりです。数値IDを使用し、base10またはbase2ではなくbase64で表示するだけです。確かにそれがわからないので、私はOPにIDがbase64の単純な64ビット整数ではないと思わせる理由を具体的に尋ねています。
ジョセフ


3
ことは同じではありませんこの
-the_lotus

回答:


101

YouTubeでは、次の2つの理由でシーケンシャルIDを使用できません。

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

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

そのため、ビデオIDは適度にランダムで予測不可能でなければなりません。IDが数字のみで表されるか、文字と数字の組み合わせで表されるかは関係ありません。ある表現から別の表現への簡単なマッピングがあります。


11
数値IDは連続している必要はありません
ソペル

28
@Sopel IMilのポイントは、YoutubeがまばらなIDを生成する必要があることだと思います。つまり、2^40アイテムを保存するだけでよいと推定される場合、一部のアーキテクチャでは、1 2^80つまたは複数のスペースを選択する正当な理由があり2^120ます。理由の例:技術的に衝突をチェックせずに衝突を減らす。秘密を見つけにくくするための一部としてキーのまばらさを使用する(「非公開ビデオ」)など
rwong

13
@Sopelの質問は、「なぜ整数(特に連続した整数)を使用しないのか?」でした。1)連続したIDは望ましくない。2)整数や文字列は、基本的には同じものです
IMil

3
「theforefore」節は論理的に続きませんが、2つの番号の付いた点は正しいです。ランダム性が必ずしも必要ではない理由の例として:均一なギャップを使用した連続番号付けは、複数の独立したデータベースに一意のIDを提供し、結果をデータウェアハウスで結合できるようにします-これはシャーディングの形式です。つまり、10000を超える地域データベースを予測しないと仮定します(たぶん、現在は10のみであるため、10000で十分です)。その後、各dbには、一意の最後の4桁の10000でカウントされるID列を含めることができ、マージ時に衝突は発生しません。
-davidbak

2
@davidbakのランダム性の要件は、(2)に従います。重複しない範囲を異なるデータベースインスタンスに割り当てることで実際に一意性を得ることができますが、これによりIDが予測可能になります。
-IMil

75
  • IDの形式について:(文字を使用して、彼らは、Base64を使用しているa- 、z- AZ- 09-および_)。これにより、文字ごとに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は、ビデオの合計量や時間枠ごとにアップロードされたビデオの数など、競合他社から情報を隠すのにも役立ちます。

トム・スコットのビデオを強くお勧めします。彼の情報はほとんど常に興味深く正確です。


6
また、base64エンコーディングの11文字に66ビットの情報が格納されていることを指摘しましょう。これは、64ビット整数をそのような文字列に簡単にマップできることを意味します。つまり、内部的には、とにかく64ビットintを使用できます(ただし、そうする必要はありません)。
ベルンハルトヒラー

1
比較のために、従来の10進表現では最大で20文字を必要とし、Base64と比較して最大9文字を「浪費」していました。
dan04

トムスコットのビデオはこれを完璧に説明しています。
AGB

13
  • 整数はそれほどスケーリングしません。「通常の」32ビット符号なし整数は、40億をわずかに超えます。

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

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


7
1)int 64を使用できます
Rakori

4
2)なぜですか?...........とにかくすべて公開されています。公開されていないものにはアクセスできません。それ
だけです-Rakori

3
3)詳しく説明できますか?どのような情報を表現しますか?
-Rakori

2
1:fort32とint64でも同じです。int64は潜在的にかなり大きいですが、十分に大きくない可能性があります。
ネフォ

3
データベースには、数値を数値として保存します。したがって、32ビットのintは32ビットかかります。テキストの密度は低くなります(テキストの
品質

8

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

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

2)連続していないIDが使用される理由

IMilの答えはそれをうまく説明しています。

YouTubeでは、次の2つの理由でシーケンシャルIDを使用できません。

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

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

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

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

  • 特定の有効なIDが動画に使用される可能性がそれほど高くない場合、人々はリストにない動画のURLを推測できます。


3
>「YouTubeは23,489,234,892,348,234,933種類のビデオをホストしていません。明らかに」これが明らかかどうかはわかりません;)
unperson325680

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を推測したとしても
-Rakori


2
@progo世界中のすべての人が平均で33億のビデオをYouTubeにアップロードしている場合...;)
Jasmijn

5

なぜ整数、特に連続した整数ではないのですか?そして、どのような場合に整数ではなくそのような文字列IDを賢明に決定するのですか?

  • より良いUTF-8スペース-数字を文字列に変換すると、文字ごとに最大10個の組み合わせ(0-9)が得られますが、英数字を許可すると、文字ごとに62個の組み合わせ(az、AZ、0-9)が得られます)、したがって、英数字文字列を使用すると、数値文字列を使用した場合よりも短いURLを生成できます。これは、YoutubeやImgurなど、ユーザーがURLを共有しているサイトにとって重要です。
  • 連続した整数の生成はより困難です。連続的に増加する整数を生成するには、単一のスレッドで数値を生成するか、分散システム内の多くのホストを調整する必要があります。 (ランダムに生成されていると言いません)

余談ですが、内部表現文字列であるとは限りません。短いURLの英数字文字列として数値識別子をエンコードしている可能性が非常に高いです。


1
2)文字列IDの場合、新しいレコードをdbに挿入する前に、文字列IDが既に生成されていることを確認する必要があります。では、int IDとの違いは何ですか?
-Rakori

@Rakorin UUIDv4のような単純なものを使用する場合でも、衝突の可能性はごくわずかです。十分なランダム性を使用すれば、チャンスはほとんど存在しないため、重複を実際に検証する必要はありません。
アンディ

1
@davidpackerと、それはより長い整数を生成することとどう違うのですか?
ソペル

@Sopel Samuelが指摘したように、整数は文字列よりも多くのスペースを占有します。つまり、長くなります。それ以外の場合、実際には違いはありません。
アンディ

1
@davidpackerが印刷された場合のみ
ソペル

2

あなたが指摘したように、フードの下ではすべてが公正で0あり1、128ビット以上までさらに正確に番号を拡張できるため、数字を使用するだけで普遍的に一意のIDを使用するのは簡単だと指摘しました。

主な理由は、uint32(例だけのために)のような任意の固定範囲を仮定して、文字を使用する場合、合計でより短いIDを持つことができるからだと思います。

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


3
これが答えだと思います。文字列の使用は、一意性を維持するのに効率的でも簡単でもありません。その理由は、その簡単にはURLとして表現するためにということである
Sopel

ユーザーがFu837tを覚えているが、2390を思い出せない場合
-Rakori

4
@Rakori:Fu837tは2223955238と比較されるので、はい。2390は「Vg」としてエンコードされるため、そうです。
Mooingダック

@MooingDuck、いいえ。その文字列IDを生成するためのアルゴリズムをどのように知っていますか?
-Rakori

3
@Rakoriそれはアルゴリズムではなく、エンコードです。異なるエンコーディング間で数値を転送するアルゴリズムがありますが、エンコーディングが適切に定義されている限り、どれを使用してもかまいません。URLの安全なbase64エンコーディングはよく知られており、標準化されています
ヨーゼフ

2

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

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

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


1

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

識別子表現の種類:

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

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

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


1

コンテンツハッシュ

「ハッシュ」という言葉は、既存の素敵な答えにはないので、ここに行きます。

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

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

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


1
少なくともYoutubeの動画IDは短すぎてハッシュにはなりません。誕生日のパラドックスが適用されます。要するに、平均して、nビットのハッシュスペースでは、2 ^(n / 2)の入力BLOBを確認した後に衝突が発生し始めます。IDが60〜70ビットである場合、30〜35ビットの一意性、つまり数十億のエントリです。彼らは今よりも多くのビデオをホストしていると確信しています。そして、もちろん、ほとんどのハッシュは整数です。それらが通常10進形式で印刷されないということは、それらが整数であるかどうかには関係ありません。確かに、同じデータはおそらく...浮動小数点バイナリデータとして解釈される可能性
からCVn

3
@MichaelKjörling:まあ、YouTubeのビデオIDは暗号化ハッシュには短すぎますが、出力が64ビット以下の多くのハッシュ関数があります。CRC-16/ 32/64、Java hashCode()などです。もちろん、ハッシュ、ランダム衝突の可能性が高くなります。
dan04

他の人にURLを覚えてもらいたい場合は、大文字と小文字を区別しないでください。そして、すべての文字の前に「上」または「下」と言うことは、単に数字を言うよりもはるかに効率的ではありません。
レンネ

0

理由の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


Gfycatを覚えています。3つの単語、2つの形容詞、1つの動物名を使用します。多くの可能性があるため(1502個のadjetive1751個の動物)、3つのオブジェクトのみを使用して30億を超える組み合わせがあります。
グスタボロドリゲス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.