Wann würden Sie eine lange Zeichenfolgen-ID anstelle einer einfachen Ganzzahl verwenden? [geschlossen]

54

Ich möchte Youtube als Beispiel verwenden: Sie verwenden IDs in Form von PEckzwggd78.

Warum verwenden sie keine einfachen ganzen Zahlen?

Oder imgur.com - sie verwenden auch IDs wie 9b6tMZSfür Bilder und Galerien. Nicht sequentielle ganze Zahlen.

  • Warum verwenden sie keine Ganzzahlen (insbesondere sequentielle)?

  • In welchen Fällen ist es eine kluge Entscheidung, solche Zeichenfolgen-IDs anstelle von Ganzzahlen zu verwenden?

Rakori
quelle
47
Warum glauben Sie, dass die IDs nicht nur einfache ganze Zahlen sind? Ich kenne viele Webdienste, die Ganzzahlen in der Datenbank verwenden, diese jedoch in einer Base64-Codierung anzeigen, damit URLs besser aussehen. Interessanterweise entsprechen die YouTube-IDs fast 64-Bit-Ganzzahlen.
Josef
2
@rwong Aber OPs Frage ist, warum sie keine numerischen IDs verwenden und die Antwort könnte lauten: Sie verwenden numerische IDs, sie zeigen sie nur in base64 an, anstatt in base10 oder base2. Ich weiß das allerdings nicht genau, also frage ich OP, warum sie glauben, die IDs seien keine einfachen 64-Bit-Ganzzahlen in base64.
Josef
3
Ist das nicht dasselbe wie das hier ?
the_lotus

Antworten:

101

Youtube kann aus zwei Gründen keine fortlaufenden IDs verwenden:

  1. Die Datenbanken sind mit ziemlicher Sicherheit verteilt, was die fortlaufende Nummerierung erschwert.

  2. Es gibt eine Datenschutzoption "Nicht aufgelistete Videos": Diese werden nicht in den Suchergebnissen angezeigt, sind jedoch verfügbar, wenn Sie die ID kennen.

Daher sollten die Video-IDs einigermaßen zufällig und nicht vorhersehbar sein. Ob die ID nur durch Ziffern oder durch eine Kombination aus Buchstaben und Ziffern dargestellt wird, spielt keine Rolle: Es gibt eine triviale Zuordnung von einer Darstellung zu einer anderen.

IMil
quelle
11
Numerische IDs müssen nicht fortlaufend sein
Sopel
28
@Sopel Ich denke, IMils Punkt ist, dass Youtube IDs generieren muss, die spärlich sind. Mit anderen Worten, wenn geschätzt wird, dass Sie immer nur 2^40Elemente speichern müssen , gibt es in einigen Architekturen legitime Gründe für die Auswahl eines Leerzeichens 2^80oder von 2^120Bits. Beispiele für Gründe sind: Reduzieren der Kollision, ohne technisch auf Kollision zu prüfen; Verwendung der Sparsamkeit der Schlüssel als Teil der Geheimnisse schwer zu finden (das "nicht gelistete Video"), etc.
rwong
13
@ Sopel die Frage war "Warum verwenden sie keine ganzen Zahlen (insbesondere sequentielle)?" Ich erkläre Folgendes: 1) Sequenzielle IDs sind unerwünscht. 2) Ganzzahlen und Strings sind im Grunde genommen dasselbe
IMil 28.11.17
3
Die "deshalb" -Klausel folgt nicht logisch, aber die zwei nummerierten Punkte sind korrekt. Ein Beispiel dafür, warum Zufälligkeit keine notwendige Konsequenz ist: Durch fortlaufende Nummerierung mit einheitlichen Lücken können eindeutige IDs in mehreren unabhängigen Datenbanken bereitgestellt werden, sodass die Ergebnisse in einem Data Warehouse kombiniert werden können. Dies ist eine Form des Shardings. Angenommen, Sie rechnen mit nicht mehr als 10000 regionalen Datenbanken (vielleicht haben Sie derzeit nur 10, sodass 10000 ausreichen). Dann kann jede Datenbank eine Identitätsspalte haben, die bis 10000 mit eindeutigen letzten 4 Ziffern zählt, es wird keine Kollision beim Zusammenführen geben.
Davidbak
2
@davidbak die Bedingung für die Zufälligkeit folgt aus (2). Die Eindeutigkeit kann in der Tat dadurch erreicht werden, dass nicht überlappende Bereiche verschiedenen Datenbankinstanzen zugewiesen werden. Dies würde jedoch die IDs vorhersehbar machen.
29.
75
  • Auf der Form der IDs: Sie sind mit Base64 (mit den Zeichen a- z, A- Z, 0- 9, -und _). Dies ermöglicht es ihnen, 6 Informationsbits pro Zeichen zu haben. YouTube verwendet 11-stellige Video-IDs. Dies bedeutet, dass 2 6 * 11 oder mehr als 7 * 10 19 IDs generiert werden können . Wie Tom Scott es ausdrückte , "reicht es aus , dass jeder einzelne Mensch auf dem Planeten Erde etwa 18.000 Jahre lang jede Minute ein Video hochlädt." Base64 ist auch einfach zu handhaben, da 64 eine Zweierpotenz ist, was bedeutet, dass jedes Zeichen eine exakte Anzahl von Bits darstellt. Aus dem gleichen Grund verwenden wir hexadezimal (Basis 16).

  • Zum nicht-sequenziellen Charakter der IDs: Dies bedeutet, dass kein synchronisierter Zähler zwischen allen Servern benötigt wird, die den Videos IDs zuweisen. Sie können einfach eine Zufallszahl generieren, prüfen, ob sie bereits verwendet wird, und von dort aus fortfahren. Sie könnten sogar jedem Server einen ID-Block zuweisen, von dem sie auswählen und die Duplizierungsprüfung beseitigen können. Ich weiß nicht, ob sie das tun, aber sie könnten es.

  • Ein weiterer Grund für die nicht sequenziellen IDs ist, dass "nicht gelistete" Videos funktionieren. Dies sind Videos, die nicht in Suchergebnissen oder als Vorschläge angezeigt werden, auf die Sie jedoch zugreifen können, wenn Sie den Link haben. Wenn Sie die sequentielle Zählung verwenden, können Sie einfach zu einem Video wechseln, die ID um eins erhöhen und die Idee nicht aufgelisteter Videos ist nun gebrochen.

  • Nicht sequenzielle IDs helfen auch dabei, Informationen vor Wettbewerbern zu verbergen, z. B. die Gesamtanzahl der Videos oder die Anzahl der pro Zeitrahmen hochgeladenen Videos.

Ich kann Tom Scotts Video wärmstens empfehlen . Seine Informationen sind fast immer sowohl interessant als auch genau.

rchard2scout
quelle
6
Wir möchten auch darauf hinweisen, dass 11 Zeichen einer Base64-Codierung 66 Bits an Informationen speichern, was bedeutet, dass sie eine 64-Bit-Ganzzahl auf einfache Weise einer solchen Zeichenfolge zuordnen können. Dh intern könnten sie sowieso ein 64bit int verwenden (müssen es aber nicht).
Bernhard Hiller
1
Zum Vergleich könnte die herkömmliche Dezimaldarstellung bis zu 20 Zeichen erfordern, was im Vergleich zu Base64 bis zu 9 Zeichen „verschwendet“.
Dan04
Das Tom Scott Video erklärt dies perfekt.
AGB
13
  • Ganzzahlen skalieren nicht so gut, eine "normale" 32-Bit-Ganzzahl ohne Vorzeichen erreicht ein Maximum von etwas mehr als 4 Milliarden.

  • Sie möchten möglicherweise nicht, dass Sie wissen, wie viele Artikel sie online haben, oder dass Sie die Rate verfolgen, mit der sie wachsen.

  • Buchstaben können mehr Informationen als Ziffern enthalten. Sie benötigen weniger Buchstaben, um dieselbe "Zahl" auszudrücken. Bei einer großen Indexer-Datenbank könnte sich dies summieren.

Martin Maat
quelle
7
1) man kann int 64
Rakori 28.11.17
4
2) warum? ........... sie sind sowieso alle öffentlich. diejenigen, die nicht öffentlich sind - sind nicht zugänglich. Das war's
Rakori
3
3) Können Sie das näher erläutern? Welche Informationen ausdrücken?
Rakori
2
Für 1 gilt das Gleiche für int32 und int64. Int64 ist zwar möglicherweise viel größer, aber möglicherweise nicht groß genug.
Nepho
3
In der Datenbank würden Sie eine Nummer als Nummer speichern. Ein 32-Bit-Int würde also 32 Bit benötigen. Text hätte eine geringere Dichte (wie viel schlechterer Text von der Kodierung abhängt)
Taemyr
8

1) Warum verwenden manche Websites Buchstaben in ihren IDs? Sind sie Saiten?

Wir wissen nicht, ob diese Websites IDs als Zeichenfolgen in ihrer Datenbank speichern. Zahlen und Zeichenfolgen sind für Computer eigentlich gleich. Eine Zeichenfolge ist nur eine Zahl, die nur mit einer anderen Basis angezeigt wird. 'A' = 0x41 = 65 = 0b1000001Für den Computer ist es alles das Gleiche. Wenn Sie es jedoch anzeigen, sind die Basis, die Darstellung und die URLs umso kürzer, je einfacher sie für den Menschen zu lesen und freizugeben sind. Websites wie YouTube und Imgur verwenden die Basis 62 (Buchstaben, Groß- und Kleinbuchstaben sowie Ziffern) oder höher (fügen Sie einen Bindestrich oder andere gültige URL-Zeichen hinzu), was für große Zahlen relativ kurz ist. Was würdest du am liebsten benutzen, youtu.be/23489234892348234933oder youtu.be/B9k6KMrv8vh?

2) Warum werden nicht sequentielle IDs verwendet?

Die Antwort von IMil erklärt es gut:

Youtube kann aus zwei Gründen keine fortlaufenden IDs verwenden:

  • Die Datenbanken sind mit ziemlicher Sicherheit verteilt, was die fortlaufende Nummerierung erschwert.

  • Es gibt eine Datenschutzoption "Nicht aufgelistete Videos": Diese werden nicht in den Suchergebnissen angezeigt, sind jedoch verfügbar, wenn Sie die ID kennen.

Dies erklärt auch, warum die IDs so groß sind: (YouTube hostet offensichtlich keine 23.489.234.892.348.234.933 verschiedenen Videos.)

  • Wenn Sie beim Generieren von IDs versehentlich zweimal dieselbe ID generieren, ist dies ein Problem. Sie benötigen daher einen großen ID-Bereich, um das Geburtstagsproblem zu vermeiden

  • Die URL nicht gelisteter Videos kann nur erraten werden, wenn die Wahrscheinlichkeit, dass eine gültige ID für ein Video verwendet wird, nicht sehr, sehr gering ist.

Jasmijn
quelle
3
> "YouTube hostet nicht 23.489.234.892.348.234.933 verschiedene Videos, offensichtlich" Ich bin mir nicht sicher, ob dies offensichtlich ist oder nicht;)
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.- Woher weißt du, ob ein nicht gelistetes Video nur für den Autor zugänglich ist? selbst wenn jemand anderes seine ID erraten hat
Rakori
2
@progo Ich meine, wenn jeder einzelne Mensch auf der Welt durchschnittlich 3,3 Milliarden Videos auf YouTube hochgeladen hat ...;)
Jasmijn
5

Warum nicht einfach ganze Zahlen, besonders sequentielle? Und wann ist es in welchen Fällen eine kluge Entscheidung, eine solche Zeichenfolgen-ID anstelle von ganzen Zahlen zu verwenden?

  • Besserer UTF-8-Raum - Wenn Sie eine Zahl in eine Zeichenfolge umwandeln, erhalten Sie höchstens 10 Kombinationen pro Zeichen (0-9). Wenn Sie jedoch alphanumerische Zeichen zulassen, erhalten Sie 62 Kombinationen pro Zeichen (az, AZ, 0-9) ). Mit alphanumerischen Zeichenfolgen können Sie also kürzere URLs erstellen als mit numerischen Zeichenfolgen. Dies ist wichtig für Websites, auf denen Benutzer URLs teilen - wie Youtube und Imgur.
  • Sequentielle Ganzzahlen sind schwieriger zu erzeugen. Um eine fortlaufend ansteigende Ganzzahl zu erzeugen, müssen Sie entweder einen einzelnen Thread haben, der die Zahlen erzeugt, oder viele Hosts in einem verteilten System koordinieren, und wenn Sie eine hochvolumige Anwendung wie Youtube oder Imgur ausführen, die nicht so gut skaliert wie eine zufällig erzeugte Zeichenfolge ( um nicht zu sagen , dass sie sind zufällig erzeugt)

Als beiseite, es ist nicht unbedingt der Fall , dass die interne Darstellung ist eine Zeichenfolge. Sie könnten sehr wahrscheinlich eine numerische Kennung als alphanumerische Zeichenfolge für die kürzere URL codieren.

Samuel
quelle
1
2) im Fall einer Zeichenfolgen-ID, aber Sie müssen sicherstellen, dass bereits eine Zeichenfolgen-ID generiert wurde, bevor Sie einen neuen Datensatz in eine Datenbank einfügen. Was ist dann der Unterschied zu einer int-ID?
Rakori
@Rakorin Auch wenn Sie etwas so Einfaches wie UUIDv4 verwenden, ist die Wahrscheinlichkeit einer Kollision sehr gering. Verwenden Sie genug Zufälligkeit und die Chance ist ziemlich nicht vorhanden, so dass die Duplizität nicht wirklich validiert werden muss.
Andy
1
@davidpacker und wie unterscheidet sich das von der Erzeugung einer längeren Ganzzahl?
Sopel
@Sopel Wie Samuel betont hat, würden die ganzen Zahlen mehr Platz beanspruchen, dh länger sein als die Zeichenketten. Ansonsten gibt es wirklich keinen Unterschied.
Andy
1
@ Davidpacker nur wenn gedruckt
Sopel
2

Sie haben darauf hingewiesen haben , dass es eine UUID mit Zahlen nur , weil unter der Haube alles zu verwenden , wäre einfach nur 0und 1und man konnte die Zahl auf mehr Präzision geht bis zu 128 Bit oder mehr erweitern.

Ich denke, der Hauptgrund ist, dass man, wenn man einen beliebigen festen Bereich annimmt, wie uint32(nur zum Beispiel), wenn man auch Buchstaben verwendet, insgesamt eine kürzere ID haben kann.

Ich stelle mir vor, dass dies ein ästhetischer Grund für die URL ist. Anstatt 4,129,873,773mit Briefen zu haben, ist es viel kürzer Fu837t(nur erfunden von mir). Ein Benutzer kann sich möglicherweise sogar die URL merken, über die er sie an einen Freund weitergibt. Plattformen wie Youtube haben normalerweise längere UUIDs als 32 Bit, da ihnen schnell der Speicherplatz ausgeht.

Ewald B.
quelle
3
Das denke ich ist die Antwort. Die Verwendung von Zeichenfolgen ist weder effizienter noch einfacher, um die Eindeutigkeit aufrechtzuerhalten. Der Grund ist, dass es einfacher ist, als URL zu repräsentieren
Sopel
Wenn sich ein Benutzer an Fu837t erinnern kann, aber nicht an 2390?
Rakori
4
@ Rakori: Fu837t würde mit 2223955238 vergleichen, also ja. Die 2390 wäre als "Vg" codiert, also: auch ja.
Mooing Duck
@MooingDuck, nein. Woher wissen Sie, wie der Algorithmus zum Generieren dieser Zeichenfolgen-ID lautet?
Rakori
3
@Rakori es ist kein Algorithmus, es ist eine Kodierung. Es gibt Algorithmen zum Übertragen von Zahlen zwischen verschiedenen Codierungen, aber es spielt keine Rolle, welche verwendet wird, solange die Codierung gut definiert ist. Die sichere Base64-Url-Codierung ist bekannt und standardisiert .
Josef
2

Eine kurze URL ist wünschenswert, da sie das Verknüpfen und Freigeben vereinfacht (z. B. Sie können einen Link in einer SMS freigeben, die Eingabe ist schneller usw.). Dienste wie Youtube oder Imgurl möchten, dass Sie URLs zufällig freigeben. Dies ist daher ein wichtiger Gesichtspunkt.

Wenn Sie alphanumerische IDs anstelle von numerischen verwenden, benötigen Sie weniger Zeichen, um eine ID mit derselben Bitgröße auszudrücken. Beispiel: 6 Ziffern geben Ihnen eine Million eindeutiger IDs, 6 alphanumerische Zeichen (unter Verwendung des base64-Satzes) geben Ihnen 68 Milliarden eindeutige IDs.

Soweit wir wissen, können die alphanumerischen Bezeichner fortlaufende Nummern sein, die nur in einem alphanumerischen Format wie base64 codiert sind. Häufig verzichten kommerzielle Dienste jedoch auf sequentielle Codes, um zu verhindern, dass Personen Ausweise erraten und Geschäftsinformationen wie die Anzahl der Kunden preisgeben.

JacquesB
quelle
1

Es gibt mehrere Gründe, warum Sie nicht-numerische IDs verwenden, aber auch, dass nicht alle Werte mit alphabetischen Zeichen wirklich Zeichenfolgen sind. YouTube hat den Ruf einer unglaublichen Anzahl von Videos, die in der Größenordnung von 300 Stunden pro Minute hochgeladen werden ( ref ). Die eindeutigen Ganzzahlen, die diese Videos darstellen, können sehr lang werden. Verwenden Sie also so etwas wie Base64-URL-codierte Zahlen ( ref ).

Arten von Identifikatordarstellungen:

  • Einfache Ganzzahlen: (12345, 981027489382493)
  • Ganzzahlen zur Basis 16: 123456789abcdef - auch Hex genannt
  • Basis 64 Ganzzahlen: 9b6tMZS
  • Lesbare Zeichenfolgen: 12032017-Read-my-awesome-article-01

Sie alle haben ihre Stärken und Schwächen. Je mehr eindeutige Zeichen Sie für Ihre Kennungen verwenden können, desto weniger Zeichen müssen Sie für eine Zahl verwenden. Zahlen zur Basis 64 sind ein ziemlich guter Kompromiss, da es eine etablierte Variante gibt, die für URLs funktioniert und die Anzahl der Zeichen komprimiert, die benötigt werden, um eine Zahl von 6 bis 8 darzustellen (dh 3/4 der Größe).

Lesbare Zeichenfolgen eignen sich für Blogs, da sie die Durchsuchbarkeit verbessern und es viel einfacher ist, eindeutige Titel zu generieren, wenn die Anzahl der Datensätze gering ist.

Berin Loritsch
quelle
1

Inhalts-Hashes

Das Wort "Hash" wird in den vorhandenen, netten Antworten nicht gefunden.

Häufig können Daten anhand ihres Inhaltshashs anstelle einer unabhängigen, künstlichen ID identifiziert werden. Dies zeigt sich besonders in Software- gitoder Dateisystemen wie ZFS, in denen diese besondere Eigenschaft der Verwendung von Inhalts-Hashes nicht nur die Arbeit erleichtert (z. B. die Deduplizierung), sondern auch andere nützliche Eigenschaften aufweist, z usw.

Hashes werden normalerweise als Hexadezimalzahlen (oder mit einem noch größeren Buchstabenabstand) ausgegeben. Aus diesem Grund werden keine Ganzzahl-IDs angezeigt. Es gibt einfach sind keine ganzen Zahlen (in diesen Fällen).

Hashes sind gut, wenn Ihre Datenobjekte unveränderlich sind (wie in ZFS oder git). Sie eignen sich hervorragend zum Speichern von Bildern, z. B. auf großen CDNs. Ich weiß nicht, ob es sich bei diesen bestimmten IDs tatsächlich um Hashes handelt, aber es wäre sicherlich sinnvoll (und wie Michael Kjörling ausführte, sind kurze IDs wahrscheinlich aus offensichtlichen Gründen keine Hashes) Hex-Ziffern).

AnoE
quelle
1
Zumindest Youtube-Video-IDs sind zu kurz, um Hashes zu sein. Es gilt das Geburtstagsparadoxon; Kurz gesagt, mit einem Hash-Raum von n Bits sehen Sie im Durchschnitt Kollisionen, nachdem Sie 2 ^ (n / 2) Input-Blobs gesehen haben. Mit ~ 60-70 Bit in der ID sind das 30-35 Bit Eindeutigkeit oder ein paar Milliarden Einträge. Ich bin mir ziemlich sicher, dass sie inzwischen mehr Videos hosten. Und natürlich sind die meisten Hashes ganze Zahlen. Dass sie normalerweise nicht in Dezimalform gedruckt werden, hat keinen Einfluss darauf, ob es sich um Ganzzahlen handelt oder nicht. Zugegeben, die gleichen Daten könnten wahrscheinlich als Gleitkomma-Binärdaten interpretiert werden ...
ein CVn vom
3
@ MichaelKjörling: Nun, YouTube-Video-IDs sind zu kurz, um kryptografische Hashes zu erstellen , aber es gibt viele Hash-Funktionen mit einer Ausgabe von 64 Bit oder weniger - CRC-16/32/64, Java hashCode()usw. Je kürzer die Hash, desto wahrscheinlicher sind zufällige Kollisionen.
Dan04
Wenn die URL gespeichert werden soll, wäre die Groß- und Kleinschreibung nicht berücksichtigt worden. Und vor jedem Buchstaben ein "oberes" oder "unteres" zu sagen, ist viel weniger effizient als nur Zahlen auszusprechen.
Lenne
0

Ok, einer der Gründe ist, dass die Zeichen als Zeichen und sowieso nicht als ganze Zahlen gesendet werden. Dies liegt daran, wie ein HTTP-Abruf funktioniert.

Wenn Sie sagen, "warum nicht eine ganze Zahl verwenden?" Nun, die ganze Zahl wird dann zerhackt und jede Ziffer wird als Zeichen gesendet, und Sie erhalten trotzdem eine Zeichenfolge. Warum also nicht alle Optionen für einen Charakter nutzen?

Es gibt auch den menschlichen Faktor:

Nehmen wir zum Beispiel imgur: https://imgur.com/ ***** / s6UqP

s6UqP,

Der Bereich für jedes Zeichen ist: a bis z, a bis z, und 0 bis 9 = 26+ 26+ 10 = 62 Optionen für jede Position in der Zeichenfolge. Mit fünf Positionen sind das 916132832 mögliche Kombinationen. Wenn Sie nur Zahlen verwenden würden, würden Sie 9 Stellen benötigen.

Menschen können ungefähr 7 Objekte speichern, 9 Stellen sind zu viel, 5 Zeichen sind möglich.

Magische Nummer 7

Pieter B
quelle
Es erinnert sich an Gfycat: Sie verwenden drei Wörter, zwei Adjektive und einen Tiernamen. Da es viele Möglichkeiten gibt ( 1502 Adjets und 1751 Tiere ), haben sie mehr als 3 Milliarden Kombinationen mit nur drei Objekten.
Gustavo Rodrigues