web-dev-qa-db-fra.com

Quand utiliseriez-vous un long ID de chaîne au lieu d'un simple entier?

Je voudrais utiliser Youtube comme exemple: ils utilisent des identifiants sous la forme de PEckzwggd78.

Pourquoi n'utilisent-ils pas de simples entiers?

Ou imgur.com - ils utilisent également des identifiants tels que 9b6tMZS pour les images et les galeries. Pas des entiers séquentiels.

  • Pourquoi n'utilisent-ils pas des nombres entiers (en particulier séquentiels)?

  • Dans quels cas est-ce une sage décision d'utiliser de tels ID de chaîne au lieu d'entiers?

57
Rakori

Youtube ne peut pas utiliser d'identifiants séquentiels pour deux raisons:

  1. Ses bases de données sont presque certainement distribuées, ce qui complique la numérotation séquentielle.

  2. Il dispose d'une option de confidentialité "Vidéos non répertoriées": celles qui n'apparaissent pas dans les résultats de recherche, mais sont disponibles si vous connaissez l'ID.

Par conséquent, les identifiants vidéo doivent être raisonnablement aléatoires et imprévisibles. Que l'ID soit représenté uniquement par des chiffres ou par une combinaison de lettres et de chiffres, cela n'a pas d'importance: il y a un mappage trivial d'une représentation à l'autre.

101
IMil
  • Sur la forme des ID: ils utilisent Base64 (en utilisant les caractères a-z, A-Z, 0-9, -, et _). Cela leur permet d'avoir 6 bits d'informations par caractère. YouTube utilise des identifiants vidéo à 11 caractères, ce qui signifie qu'ils peuvent générer 26 * 11, ou plus de 7 * 1019 ID. Comme Tom Scott l'a dit , c'est "suffisant pour que chaque être humain sur la planète Terre télécharge une vidéo toutes les minutes pendant environ 18 000 ans". Base64 est également facile à utiliser, car 64 est une puissance de 2, ce qui signifie que chaque caractère représente un nombre exact de bits. Nous utilisons hexadécimal (base 16) pour la même raison.

  • Sur la nature non séquentielle des identifiants: cela signifie qu'ils n'ont pas besoin d'un compteur synchronisé entre tous les serveurs qui attribuent des identifiants aux vidéos. Ils peuvent simplement générer un nombre aléatoire, vérifier s'il est déjà utilisé et partir de là. Ils pourraient même attribuer à chaque serveur un bloc d'ID à sélectionner et éliminer la vérification de duplication. Je ne sais pas s'ils le font, mais ils le pourraient.

  • Une autre raison pour les identifiants non séquentiels est que c'est ce qui fait fonctionner les vidéos "non répertoriées". Ce sont des vidéos qui n'apparaîtront pas dans les résultats de recherche ou comme suggestions, mais qui sont accessibles si vous avez le lien. Si vous utilisez le comptage séquentiel, vous pouvez simplement aller à une vidéo, augmenter l'ID d'une unité, et l'idée de vidéos non répertoriées est maintenant rompue.

  • Les identifiants non séquentiels aident également à masquer les informations des concurrents, telles que le nombre total de vidéos ou le nombre de vidéos téléchargées par période.

Je peux fortement recommander vidéo de Tom Scott . Ses informations sont presque toujours à la fois intéressantes et exactes.

75
rchard2scout
  • Les entiers n'évoluent pas aussi bien, un entier non signé 32 bits "normal" ne dépassera pas un peu plus de 4 milliards.

  • Ils peuvent ne pas vouloir que vous sachiez combien d'articles ils ont en ligne ou que vous gardiez une trace du taux de croissance.

  • Les lettres peuvent contenir plus d'informations que les chiffres, vous avez besoin de moins de lettres pour exprimer le même "nombre". Pour une grande base de données d'indexation, cela pourrait s'additionner.

13
Martin Maat

1) Pourquoi certains sites Web utilisent-ils des lettres dans leurs identifiants? S'agit-il de cordes?

Nous ne savons pas si ces sites Web stockent des ID dans leur base de données sous forme de chaînes. Les nombres et les chaînes sont vraiment les mêmes que pour les ordinateurs. Une chaîne n'est qu'un nombre, juste affiché avec une base différente. 'A' = 0x41 = 65 = 0b1000001, pour l'ordinateur c'est pareil. Mais si vous l'affichez, plus la base est grande, plus la représentation est courte et les URL plus courtes sont plus faciles à lire et à partager pour les humains. Des sites comme YouTube et Imgur utilisent la base 62 (lettres, majuscules et minuscules, plus les chiffres) ou plus (ajoutez un tiret ou d'autres caractères URL valides), ce qui est relativement court pour les grands nombres. Que préférez-vous utiliser, youtu.be/23489234892348234933 ou youtu.be/B9k6KMrv8vh?

2) Pourquoi des identifiants non séquentiels sont-ils utilisés?

La réponse de IMil l'explique bien:

Youtube ne peut pas utiliser d'identifiants séquentiels pour deux raisons:

  • Ses bases de données sont presque certainement distribuées, ce qui complique la numérotation séquentielle.

  • Il dispose d'une option de confidentialité "Vidéos non répertoriées": celles qui n'apparaissent pas dans les résultats de recherche, mais sont disponibles si vous connaissez l'ID.

Ceux-ci expliquent également pourquoi les identifiants sont si volumineux: (YouTube n'héberge pas 23 489 234 892 348 234 933 vidéos différentes, évidemment)

  • Lors de la génération d'ID, c'est un problème si vous générez accidentellement le même ID deux fois, vous avez donc besoin d'un grand espace ID pour éviter le problème d'anniversaire

  • Les gens peuvent juste deviner l'URL des vidéos non répertoriées si la probabilité qu'un ID valide donné soit utilisé pour une vidéo n'est pas très, très faible.

8
Jasmijn

pourquoi pas seulement des entiers, notamment séquentiels? Et quand, dans quels cas est-ce une sage décision d'utiliser un tel ID de chaîne au lieu d'entiers?

  • Meilleur espace UTF-8 - lorsque vous transformez un nombre en chaîne, vous obtenez au plus 10 combinaisons par caractère (0-9), mais lorsque vous autorisez des caractères alphanumériques, vous obtenez 62 combinaisons par caractère (az, AZ, 0-9 ), donc en utilisant des chaînes alphanumériques, vous pouvez produire des URL plus courtes que si vous utilisiez des chaînes numériques. Ceci est important pour les sites où les utilisateurs partagent des URL - comme Youtube et Imgur.
  • Les entiers séquentiels sont plus difficiles à produire. Pour produire un entier croissant séquentiel, vous devez soit avoir un seul thread pour produire les nombres, soit coordonner de nombreux hôtes dans un système distribué, et lorsque vous exécutez une application à volume élevé comme Youtube ou Imgur qui ne s'adapte pas aussi bien qu'une chaîne générée de manière aléatoire (pour ne pas dire qu'ils sont générés aléatoirement)

En passant, ce n'est pas nécessairement le cas que la représentation interne is une chaîne. Ils pourraient très probablement encoder un identificateur numérique sous forme de chaîne alphanumérique pour l'URL plus courte.

5
Samuel

Comme vous l'avez souligné, il serait facile d'utiliser un ID universellement unique en utilisant simplement des chiffres, car sous le capot, tout est simplement 0 et 1 et vous pouvez étendre le nombre à une précision allant jusqu'à 128 bits ou plus.

Je pense que la raison principale est que, en supposant une plage fixe arbitraire comme uint32 (juste pour un exemple), si vous utilisez également des lettres, vous pouvez avoir un identifiant plus court au total.

J'imagine que c'est une raison esthétique pour l'URL. Au lieu d'avoir 4,129,873,773 avec des lettres c'est beaucoup plus court Fu837t (juste fictif inventé par moi). Un utilisateur peut même se souvenir de l'URL pour l'avoir donnée à un ami. Les plates-formes comme Youtube ont généralement des UUID plus longs que 32 bits car ils manqueraient rapidement d'espace.

2
Ewald B.

Une URL courte est souhaitable car elle facilite la liaison et le partage (par exemple, vous pouvez partager un lien dans un SMS, il est plus rapide à taper, etc.). Des services comme Youtube ou Imgurl veulent que vous partagiez des URL de manière décontractée, c'est donc une considération importante.

L'utilisation d'ID alphanumériques plutôt que numériques signifie que vous avez besoin de moins de caractères pour exprimer un ID de la même taille en bits. Par exemple, 6 chiffres vous donnent un million d'identifiants uniques mais 6 caractères alphanumériques (en utilisant l'ensemble base64) vous donnent 68 milliards identifiants uniques.

Pour tout ce que nous savons, les identifiants alphanumériques pourraient être des nombres séquentiels, juste encodés dans un format alphanumérique comme base64. Mais souvent, les services commerciaux évitent les codes séquentiels pour empêcher les gens de deviner les identifiants et pour éviter de divulguer des informations commerciales comme le nombre de clients.

2
JacquesB

Hachage de contenu

Le mot "hachage" ne se trouve pas dans les réponses existantes de Nice, alors c'est parti:

Souvent, les données peuvent être identifiées par leur hachage de contenu au lieu d'un ID artificiel indépendant. Cela est particulièrement évident dans des logiciels comme git ou des systèmes de fichiers comme ZFS où cette propriété particulière d'utiliser des hachages de contenu facilite non seulement les choses (par exemple la déduplication), mais a également d'autres propriétés Nice comme la mise en cache triviale, un historique sécurisé, détection de la pourriture des bits, etc.

Les hachages se présentent généralement sous la forme de nombres hexadécimaux (ou d'un espace de lettre encore plus grand), c'est pourquoi vous ne voyez pas les ID entiers. Il n'y a simplement sont pas d'entiers (dans ces cas).

Les hachages sont bons si vos objets de données sont immuables (comme dans ZFS ou git); ils seraient parfaits pour stocker des images, par exemple, sur de gros CDN. Je ne sais pas si ces ID en particulier sont des hachages, mais cela aurait certainement du sens (et comme Michael Kjörling l'a commenté, court les ID ne sont probablement pas des hachages pour des raisons évidentes - comme comparaison, git utilise des valeurs SHA-1 qui sont de 20 octets ou 40 chiffres hexadécimaux).

1
AnoE

Il y a plusieurs raisons pour lesquelles vous utiliseriez des identifiants non numériques, mais comprenez également que toutes les valeurs avec des caractères alphabétiques ne sont pas vraiment des chaînes. YouTube a la réputation d'un nombre incroyable de vidéos, de l'ordre de 300 heures de vidéo mises en ligne chaque minute ( ref ). Les entiers uniques représentant ces vidéos peuvent devenir assez longs, donc utilisez quelque chose comme des nombres encodés en URL Base64 ( ref ).

Types de représentations d'identificateurs:

  • Entiers simples: (12345, 981027489382493)
  • Entiers de base 16: 123456789abcdef - également appelé hex
  • Entiers de base 64: 9b6tMZS
  • Chaînes lisibles: 12032017-Read-my-awesome-article-01

Ils ont tous leurs forces et leurs faiblesses. Plus vous pouvez utiliser de caractères uniques pour vos identifiants, moins vous avez besoin de caractères pour représenter un nombre. Les nombres en base 64 sont un assez bon compromis car il existe une variante établie qui fonctionne pour les URL et compresse le nombre de caractères nécessaires pour représenter un nombre de 6 à 8 (soit 3/4e de la taille).

Les chaînes lisibles fonctionnent pour les blogs car elles peuvent augmenter la recherche, et il est beaucoup plus facile de générer des titres uniques lorsque le nombre d'enregistrements est petit.

1
Berin Loritsch

Ok, l'une des raisons est que les caractères sont envoyés sous forme de caractères et non sous forme d'entiers de toute façon. Cela est dû au fonctionnement d'un HTTP Get.

Quand vous dites: "pourquoi ne pas utiliser un entier?" Eh bien, l'entier est ensuite haché et chaque chiffre est envoyé sous forme de caractère et vous vous retrouvez avec une chaîne de caractères de toute façon. Alors pourquoi ne pas utiliser toutes les options d'un personnage?

Il y a aussi le facteur humain:

Prenez par exemple imgur: https://imgur.com/ *****/s6UqP

s6UqP,

La plage pour chaque caractère est la suivante: a à z majuscule, a à z sous-capital et 0 à 9 = 26+ 26+ 10 = 62 options pour chaque position dans la chaîne. Avec cinq positions, c'est 916132832 combinaisons possibles. Si vous n'utilisiez que des chiffres, vous auriez besoin de 9 chiffres.

Les gens peuvent contenir environ 7 objets en mémoire, 9 chiffres, c'est trop, 5 caractères sont réalisables.

Numéro magique 7

0
Pieter B