php - para - Cómo generar identificaciones únicas de enteros únicos como Facebook Twitter
generador de direcciones usa (3)
El comentario de Flickr arriba fue muy útil. También usamos fragmentos. Tenemos un campo localizador bigint (int64). Se genera combinando un id de base de datos int (int32) y un campo de identidad int (int32).
Si sabe que tendrá un número máximo de 16 bases de datos int16 (bastante probable), puede combinar una identificación de base de datos int16 (smallint) y una identificación de usuario int32 (int) y una identificación de acción int16 (smallint). No sé números razonables para su aplicación. Pero reserve alguna parte para el ID de la base de datos, incluso si es solo diminuto, para que sepa que está a salvo en el futuro si agrega más bases de datos.
Después de buscar en SO y otros sitios, no he podido encontrar pruebas concluyentes de cómo Facebook, Twitter y Pinterest generan sus ID. La razón por la que esto es necesario es para evitar las colisiones de url. Moverse a una ID completamente diferente evitará esto porque no habrá cuatrillones de registros.
- Facebook.com/username/posts/ 362095193814294
- Pinterest.com/pin/ 62487513549577588
- Twitter.com/#!/username/status/ 17994686627061761
Si nos fijamos en Pinterest como ejemplo, los primeros dígitos se relacionan con el ID de usuario, y los últimos 6 o más dígitos representan el ID de guardado que posiblemente podría ser un incremento automático.
Para crear una ID similar, pero no única, pude usar: base_convert(user_id.save_id, 16, 10)
. El problema aquí es que no es único, por ejemplo: base_convert(15.211, 16, 10)
vs. base_convert(152.11, 16, 10)
. Estos dos son los mismos. Simplemente con solo fusionar dos conjuntos únicos de números se obtendrán resultados duplicados. Lanzar uniqid()
en la mezcla esencialmente solucionará los duplicados, pero esto no parece ser una gran práctica.
Actualización: Twitter parece usar esto: https://github.com/twitter/snowflake
¿Alguna sugerencia sobre cómo generar una identificación única como los ejemplos anteriores?
En realidad, si observa (por ejemplo) los ID de los usuarios de sus Amigos (en Facebook), notará que son secuenciales entre todos los usuarios, exactamente como un campo de base de datos de AUTO_INCREMENT. Sin embargo, es probable que no empiecen en 1. Mi lista de amigos, por ejemplo, tiene algunos números en millones, luego saltan repentinamente a 1 trillón y algo, así que supongo que el valor del autoincremento se incrementó, esto puede hacerse para "ocultar" exactamente cuántos usuarios hay.
De todos modos, para generar ID únicas, simplemente créalas secuencialmente con ese campo AUTO_INCREMENT. Opcionalmente, establezca el valor inicial en algo alto.
Supongamos que sus identificaciones son todas numéricas. Delimítelos con un carácter A
(ya que seguramente no aparece en las ID originales) y realice una conversión de base de base-11 a base-10.
Por el ejemplo que hiciste ahora obtenemos diferentes resultados:
echo base_convert("15A211", 11, 10); //247820
echo base_convert("152A11", 11, 10); //238140