Comment générer des identifiants uniques entiers comme Facebook Twitter
Après la recherche, et d'autres sites, je n'ai pas réussi à venir avec des preuves concluantes à la façon dont Facebook, Twitter et Pinterest générer leurs ID. La raison de ce qui est nécessaire pour éviter les url des collisions. Se déplaçant à une tout autre code d'identification de la prévenir de cela parce qu'il ne sera pas trillions de dossiers.
- Facebook.com/username/posts/362095193814294
- Pinterest.com/pin/62487513549577588
- Twitter.com/#!/nom d'utilisateur/statut/17994686627061761
Si vous regardez Pinterest comme un exemple, les quelques premiers chiffres se rapportent à l'id d'utilisateur et le dernier 6 chiffres représentent l'enregistrer id qui pourrait éventuellement être un auto incrément.
Pour créer un ID, mais pas unique, j'ai pu utiliser: base_convert(user_id.save_id, 16, 10)
. Le problème ici est qu'il n'est pas unique, ex: base_convert(15.211, 16, 10)
vs base_convert(152.11, 16, 10)
. Ces deux sont les mêmes. Il suffit juste de la fusion de deux ensembles de nombres seront toujours produire les résultats. Jeter uniqid()
dans le mélange essentiellement à corriger les doublons, mais cela ne semble pas être une grande pratique.
Mise à jour: Twitter semble utiliser ce: https://github.com/twitter/snowflake
Des suggestions sur la génération d'un IDENTIFIANT unique, comme les exemples ci-dessus?
source d'informationauteur stwhite
Vous devez vous connecter pour publier un commentaire.
Le Flickr commentaire ci-dessus a été très utile. Nous utilisons la fragmentation. Nous avons un bigint (int64) localisateur de champ. Il est généré par la combinaison d'un int (int32) id de base de données et un int (int32) champ d'identité.
Si vous savez que vous aurez un int16 nombre de base de données max (très probable), vous pouvez combiner un int16 (smallint) id de base de données et un int32 (int) id utilisateur et un int16 (smallint) l'id d'action. Je ne sais pas nombre raisonnable pour votre application. Mais réserve quelques partie pour l'id de base de données, même si c'est juste tinyint, de sorte que vous savez que vous êtes avenir sûr, si vous ajoutez plus de bases de données.
Supposons que vos Identifiants sont tous numériques. Encadrés par un personnage
A
(puisqu'il n'apparaît pas dans l'original IDs) et de faire une base de conversion de base-11 en base 10.Pour l'exemple que vous avez maintenant, nous obtenons des résultats différents:
En fait, si vous regardez (par exemple) les Id des utilisateurs sur vos Amis (sur Facebook), vous remarqueriez qu'ils sont séquentiels entre tous les utilisateurs, exactement comme un AUTO_INCREMENT champ de base de données. Cependant, ils ne sont probablement pas commencer à 1. Ma liste d'amis, par exemple, a un certain nombre de millions, puis soudainement saut à 1 billion de dollars et quelque chose, donc je suppose que la valeur auto_increment a été frappé jusqu' - ce qui peut être fait pour "cacher" exactement combien d'utilisateurs.
De toute façon, pour générer des Identifiants uniques, il suffit de créer de manière séquentielle avec ce champ de type AUTO_INCREMENT. Vous pouvez également définir la valeur initiale de quelque chose de haut.