¿Cuándo usarías una ID de cadena larga en lugar de un entero simple? [cerrado]


54

Me gustaría usar Youtube como ejemplo: usan ID en forma de PEckzwggd78.

¿Por qué no usan enteros simples?

O imgur.com: también usan ID, como 9b6tMZSimágenes y galerías. No enteros secuenciales.

  • ¿Por qué no usan números enteros (particularmente los secuenciales)?

  • ¿En qué casos es una sabia decisión usar tales ID de cadena en lugar de enteros?


47
¿Qué te hace creer que los ID no son simples enteros? Conozco muchos servicios web que usan números enteros en la base de datos pero los muestran en alguna codificación base64 para que las URL se vean mejor. Curiosamente, los ID de youtube casi se asignan a enteros de 64 bits.
Josef

2
@rwong Pero la pregunta de los OP es por qué no usan ID numéricos y la respuesta podría ser: usan ID numéricos, solo los muestran en base64 en lugar de base10 o base2. Sin embargo, no lo sé con certeza, así que le pregunto a OP qué los hace pensar específicamente que los ID no son enteros simples de 64 bits en base64.
Josef


3
¿No es lo mismo que esto ?
the_lotus

Respuestas:


101

Youtube no puede usar ID secuenciales por dos razones:

  1. Es casi seguro que sus bases de datos se distribuyen, lo que complica la numeración secuencial.

  2. Tiene una opción de privacidad "Videos no listados": aquellos que no aparecen en los resultados de búsqueda, pero están disponibles si conoce la ID.

Por lo tanto, las identificaciones de video deben ser razonablemente aleatorias e impredecibles. Si la ID está representada solo por dígitos, o por una combinación de letras y dígitos, es irrelevante: hay una asignación trivial de una representación a otra.


11
Los identificadores numéricos no tienen que ser secuenciales
Sopel

28
@Sopel Creo que el punto de IMil es que Youtube necesita generar identificaciones que son escasas. En otras palabras, si se estima que sólo necesitará siempre para almacenar 2^40artículos, en algunas arquitecturas hay razones legítimas para la elección de un espacio de 2^80o 2^120bits. Ejemplos de razones son: reducir la colisión sin verificar técnicamente la colisión; mediante la diseminación de teclas como parte de hacer secretos difíciles de encontrar (el "vídeo sin clasificar"), etc.
rwong

13
@Sopel la pregunta era "¿Por qué no usan números enteros (particularmente los secuenciales)?" Les explico que: 1) los ID secuenciales no son deseados; 2) los enteros y las cadenas son básicamente lo mismo
IMil

3
La cláusula "por lo tanto" no sigue lógicamente, pero los dos puntos numerados son correctos. Como ejemplo de por qué la aleatoriedad no es un consecuente necesario: la numeración secuencial con espacios uniformes funcionará para proporcionar identificadores únicos en múltiples bases de datos independientes de modo que los resultados se puedan combinar en un datawarehouse; esta es una forma de fragmentación. Es decir, suponga que anticipa no más de 10000 bases de datos regionales (quizás solo tenga 10 en este momento, por lo que 10000 es suficiente). Luego, cada base de datos puede tener una columna de identidad que cuenta hasta 10000 con los últimos 4 dígitos únicos, no habrá colisión al fusionar.
davidbak

2
@davidbak el requisito de aleatoriedad se deduce de (2). De hecho, la unicidad se puede obtener asignando rangos no superpuestos a diferentes instancias de la base de datos, pero esto dejaría las ID predecibles.
IMil

75
  • En la forma de los identificadores: Están usando Base64 (utilizando los caracteres a- z, A- Z, 0- 9, -y _). Esto les permite tener 6 bits de información por personaje. YouTube utiliza ID de video de 11 caracteres, lo que significa que pueden generar 2 6 * 11 , o más de 7 * 10 19 ID. Como dijo Tom Scott , eso es "suficiente para que cada humano en el planeta Tierra cargue un video cada minuto durante unos 18,000 años". También es fácil trabajar con Base64, porque 64 es una potencia de 2, lo que significa que cada carácter representa un número exacto de bits. Usamos hexadecimal (base 16) por la misma razón.

  • Sobre la naturaleza no secuencial de las ID: significa que no necesitan un contador sincronizado entre todos los servidores que asignan ID a los videos. Simplemente pueden generar un número aleatorio, verificar si ya está en uso e ir desde allí. Incluso podrían asignar a cada servidor un bloque de ID para elegir y eliminar la verificación de duplicación. No sé si lo están haciendo, pero podrían hacerlo.

  • Otra razón para las identificaciones no secuenciales es que es lo que hace que funcionen los videos "no listados". Estos son videos que no aparecerán en los resultados de búsqueda o como sugerencias, pero que son accesibles si tiene el enlace. Si está utilizando el recuento secuencial, simplemente puede ir a un video, aumentar la ID en uno y la idea de videos no listados ahora se rompe.

  • Las ID no secuenciales también ayudan a ocultar información de la competencia, como la cantidad total de videos o la cantidad de videos cargados por período de tiempo.

Puedo recomendar el video de Tom Scott . Su información casi siempre es interesante y precisa.


66
Señalemos también que 11 caracteres de una codificación base64 almacenan 66 bits de información, lo que significa que pueden mapear fácilmente un entero de 64 bits en dicha cadena. Es decir, internamente, podrían usar un int 64bit de todos modos (pero no necesitan hacerlo).
Bernhard Hiller el

1
A modo de comparación, la representación decimal convencional podría requerir hasta 20 caracteres, "desperdiciando" hasta 9 caracteres en comparación con Base64.
dan04

El video de Tom Scott explica esto perfectamente.
AGB

13
  • Los enteros no se escalan tan bien, un entero sin signo "normal" de 32 bits alcanzará un máximo de poco más de 4 mil millones.

  • Es posible que no quieran que sepa cuántos artículos tienen en línea o que haga un seguimiento de la tasa de crecimiento.

  • Las letras pueden contener más información que los dígitos, necesita menos letras para expresar el mismo "número". Para una gran base de datos indexadora esto podría sumar.


77
1) se puede usar int 64
Rakori

44
2) ¿por qué? ........... todos son públicos de todos modos. aquellos que no son públicos, no son accesibles. eso es todo
Rakori

3
3) ¿puedes elaborar? expresar qué información?
Rakori

2
Para 1: lo mismo aplica para int32 e int64. Si bien int64 es potencialmente mucho más grande, podría no ser lo suficientemente grande.
Nepho

3
En la base de datos, almacenarías un número como número. Entonces un int de 32 bits tomaría 32 bits. El texto tendría menos densidad (la cantidad de texto más pobre dependería de la codificación)
Taemyr

8

1) ¿Por qué algunos sitios web usan letras en sus ID? ¿Son cuerdas?

No sabemos si esos sitios web almacenan ID en sus bases de datos como cadenas. Los números y las cadenas son realmente iguales para las computadoras. Una cadena es solo un número, solo se muestra con una base diferente. 'A' = 0x41 = 65 = 0b1000001, para la computadora todo es lo mismo. Pero si lo muestra, cuanto mayor sea la base, menor será la representación y las URL más cortas serán más fáciles de leer y compartir para los humanos. Sitios como YouTube e Imgur usan la base 62 (letras, mayúsculas y minúsculas, más dígitos) o más grande (agregue un guión u otros caracteres de URL válidos), que es relativamente corto para números grandes. ¿Qué preferirías usar youtu.be/23489234892348234933o youtu.be/B9k6KMrv8vh?

2) ¿Por qué se usan ID no secuenciales?

La respuesta de IMil lo explica bien:

Youtube no puede usar ID secuenciales por dos razones:

  • Es casi seguro que sus bases de datos se distribuyen, lo que complica la numeración secuencial.

  • Tiene una opción de privacidad "Videos no listados": aquellos que no aparecen en los resultados de búsqueda, pero están disponibles si conoce la ID.

Esto también explica por qué los ID son tan grandes: (YouTube no aloja 23,489,234,892,348,234,933 videos diferentes, obviamente)

  • Al generar ID, es un problema si accidentalmente genera la misma ID dos veces, por lo que necesita un gran espacio de ID para evitar el problema de cumpleaños

  • La gente puede adivinar la URL de los videos no listados si la posibilidad de que se use una ID válida para un video no es muy, muy pequeña.


3
> "YouTube no aloja 23,489,234,892,348,234,933 videos diferentes, obviamente" No estoy tan seguro de si esto es obvio o no;)
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.- ¿Cómo saber si un video no listado no es accesible para todos excepto su autor? incluso si alguien más ha adivinado su identificación
Rakori


2
@progo, quiero decir, si cada persona en el mundo ha subido 3.300 millones de videos a YouTube en promedio ...;)
Jasmijn

5

¿Por qué no solo enteros, particularmente los secuenciales? ¿Y cuándo, en qué casos es una sabia decisión usar una ID de cadena en lugar de enteros?

  • Mejor espacio UTF-8: cuando convierte un número en una cadena, obtiene como máximo 10 combinaciones por carácter (0-9), pero cuando permite cualquier carácter alfanumérico, obtiene 62 combinaciones por carácter (az, AZ, 0-9 ), de modo que al usar cadenas alfanuméricas puede producir URL más cortas que si usara cadenas numéricas. Esto es importante para los sitios donde los usuarios comparten URL, como Youtube e Imgur.
  • Los enteros secuenciales son más difíciles de producir. Para producir un número entero creciente secuencial, debe hacer que un solo subproceso produzca los números o coordinar muchos hosts en un sistema distribuido, y cuando ejecuta una aplicación de alto volumen como Youtube o Imgur que no se escala tan bien como una cadena generada aleatoriamente (por no decir que están generando aleatoriamente)

Por otro lado, no es necesariamente el caso de que la representación interna sea una cadena. Es muy probable que estén codificando un identificador numérico como una cadena alfanumérica para la url más corta.


1
2) en el caso de una ID de cadena, pero deberá verificar que ya se haya generado una ID de cadena antes de insertar un nuevo registro en una base de datos. ¿Cuál es la diferencia con una identificación int entonces?
Rakori

@Rakorin Incluso cuando se usa algo tan simple como UUIDv4, la posibilidad de colisión es minúscula. Use suficiente aleatoriedad y la posibilidad es bastante inexistente, por lo que la duplicidad realmente no necesita ser validada.
Andy

1
@davidpacker y ¿en qué se diferencia eso de generar un número entero más largo?
Sopel

@Sopel Como Samuel ha señalado, los enteros ocuparían más espacio, es decir, serían más largos que las cuerdas. De lo contrario, realmente no hay ninguna diferencia.
Andy

1
@davidpacker solo cuando se imprime
Sopel

2

Como ha señalado, sería fácil usar una identificación universalmente única simplemente usando números porque debajo del capó todo es justo 0y 1podría expandir el número a una mayor precisión hasta 128 bits o más.

Creo que la razón principal es que, suponiendo un rango fijo arbitrario como uint32(solo por el bien de un ejemplo), si también usa letras, puede tener una ID más corta en total.

Me imagino que es una razón estética para la URL. En lugar de tener 4,129,873,773letras, es mucho más corto Fu837t(solo ficticio inventado por mí). Un usuario podría incluso recordar la URL para dársela a un amigo. Las plataformas como Youtube generalmente tienen UUID más largos que 32 bits porque se quedarían sin espacio rápidamente.


3
Esta creo que es la respuesta. Usar cadenas no es ni más eficiente ni más fácil de mantener la unicidad. La razón es que es más fácil de representar como una url
Sopel

si un usuario puede recordar Fu837t, pero ¿no puede recordar 2390?
Rakori

44
@Rakori: Fu837t se compararía con 2223955238, entonces sí. El 2390 se codificaría como "Vg", entonces: también sí.
Mooing Duck

@MooingDuck, no. ¿Cómo sabes cuál es el algoritmo para generar esa ID de cadena?
Rakori

3
@Rakori no es un algoritmo, es una codificación. Hay algoritmos para transferir números entre diferentes codificaciones, pero cuál se usa no importa siempre que la codificación esté bien definida. La codificación base64 segura de URL es bien conocida y estandarizada .
Josef

2

Una URL corta es deseable ya que simplifica el enlace y el intercambio (por ejemplo, puede compartir un enlace en un SMS, es más rápido escribir, etc.). Servicios como Youtube o Imgurl quieren que compartas URL de manera casual, por lo que esta es una consideración importante.

El uso de ID alfanuméricos en lugar de numéricos significa que necesita menos caracteres para expresar una ID del mismo tamaño de bit. Por ejemplo, 6 dígitos le dan un millón de identificaciones únicas, pero 6 caracteres alfanuméricos (usando el conjunto base64) le dan 68 mil millones de identificadores únicos.

Por lo que sabemos, los identificadores alfanuméricos podrían ser números secuenciales, simplemente codificados en un formato alfanumérico como base64. Pero a menudo los servicios comerciales evitan los códigos secuenciales para evitar que las personas adivinen las identificaciones y para evitar revelar información comercial como la cantidad de clientes.


1

Hay varias razones por las que usaría identificadores no numéricos, pero también comprende que no todos los valores con caracteres alfabéticos son realmente cadenas. YouTube tiene la reputación de una increíble cantidad de videos, del orden de 300 horas de video subidas cada minuto ( ref ). Los enteros únicos que representan esos videos pueden ser bastante largos, por lo tanto, use algo como números codificados en URL de Base64 ( ref ).

Tipos de representaciones de identificadores:

  • Enteros simples: (12345, 981027489382493)
  • Base 16 enteros: 123456789abcdef - también conocido como Hex
  • Base 64 enteros: 9b6tMZS
  • Cadenas legibles: 12032017-Read-my-awesome-article-01

Todos tienen sus fortalezas y debilidades. Cuantos más caracteres únicos pueda usar para sus identificadores, menos caracteres necesitará para representar un número. Los números de base 64 son un compromiso bastante bueno porque hay una variante establecida que funciona para las URL y comprime el número de caracteres necesarios para representar un número de 6 a 8 (es decir, 3/4 del tamaño).

Las cadenas legibles funcionan para los blogs porque pueden aumentar la capacidad de búsqueda, y es mucho más fácil generar títulos únicos cuando el número de registros es pequeño.


1

Contenido hashes

La palabra "hash" no se encuentra en las respuestas existentes, agradables, así que aquí vamos:

A menudo, los datos se pueden identificar por su hash de contenido en lugar de una identificación artificial independiente. Esto es particularmente evidente en software gito sistemas de archivos como ZFS, donde esta propiedad particular de usar hashes de contenido no solo facilita las cosas (por ejemplo, la desduplicación), sino que también tiene otras propiedades agradables como el almacenamiento en caché trivial, un historial seguro, la detección de la descomposición de bits etc.

Los hashes generalmente vienen como números hexadecimales (o un espacio de letras aún más grande), por eso no se ven identificaciones de enteros. Simplemente son no enteros (en esos casos).

Los hashes son buenos si sus objetos de datos son inmutables (como en ZFS o git); serían geniales para almacenar imágenes, por ejemplo, en grandes CDN. No sé si esas ID particulares son realmente hashes, pero sin duda tendría sentido (y como comentó Michael Kjörling, las ID cortas probablemente no sean hashes por razones obvias; en comparación, git usa valores SHA-1 que son 20 bytes o 40 dígitos hexadecimales).


1
Al menos las identificaciones de video de Youtube son demasiado cortas para ser hash. Se aplica la paradoja del cumpleaños; en resumen, en promedio, con un espacio hash de n bits, comenzará a ver colisiones después de ver 2 ^ (n / 2) blobs de entrada. Con ~ 60-70 bits en la ID, eso es 30-35 bits de unicidad, o unos pocos miles de millones de entradas. Estoy bastante seguro de que ahora tienen más videos que eso. Y, por supuesto, la mayoría de los hashes son enteros bien; que normalmente no se imprimen en forma decimal no influye en si son enteros o no. Es cierto que los mismos datos probablemente podrían interpretarse como datos binarios de punto flotante ...
un CVn

3
@ MichaelKjörling: Bueno, las identificaciones de video de YouTube son demasiado cortas para ser hash criptográficos , pero hay muchas funciones hash que tienen 64 bits de salida o menos: CRC-16/32/64, Java hashCode(), etc. Por supuesto, cuanto más cortas sean hash, las colisiones aleatorias más probables son.
dan04

Si quisieras que la gente recordara la URL, no lo hubieras hecho significativo. Y tener que decir "superior" o "inferior" delante de cada letra es mucho menos eficiente que simplemente decir números.
Lenne

0

Ok, una de las razones es que los caracteres se envían como caracteres y no como enteros de todos modos. Esto se debe a cómo funciona un Get HTTP.

Cuando dices, "¿por qué no usar un número entero?" Bueno, el número entero se corta y cada dígito se envía como un carácter y de todos modos terminas con una cadena de caracteres. Entonces, ¿por qué no usar todas las opciones para un personaje?

También está el factor humano:

Tome imgur por ejemplo: https://imgur.com/ ***** / s6UqP

s6UqP,

El rango para cada personaje es: a hasta z mayúscula, a hasta z subcapital, y 0 a 9 = 26+ 26+ 10 = 62 opciones para cada posición en la cadena. Con cinco posiciones, eso es 916132832 combinaciones posibles. Si solo usara números, necesitaría 9 dígitos.

Las personas pueden almacenar aproximadamente 7 objetos en la memoria, 9 dígitos es demasiado, 5 caracteres son factibles.

Número mágico 7


Recuerda a Gfycat: usan tres palabras, dos adjetivos y un nombre de animal. Debido a que hay muchas posibilidades ( 1502 adjetivos y 1751 animales ) tienen más de 3 mil millones de combinaciones usando solo tres objetos.
Gustavo Rodrigues
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.