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 9b6tMZS
imá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?
Respuestas:
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.
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.
fuente
2^40
artículos, en algunas arquitecturas hay razones legítimas para la elección de un espacio de2^80
o2^120
bits. 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.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.
fuente
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.
fuente
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 usaryoutu.be/23489234892348234933
oyoutu.be/B9k6KMrv8vh
?2) ¿Por qué se usan ID no secuenciales?
La respuesta de IMil lo explica bien:
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.
fuente
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ónPor 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.
fuente
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
0
y1
podrí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,773
letras, es mucho más cortoFu837t
(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.fuente
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.
fuente
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:
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.
fuente
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
git
o 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).fuente
hashCode()
, etc. Por supuesto, cuanto más cortas sean hash, las colisiones aleatorias más probables son.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
fuente