Algorithme pour générer un identifiant unique en C ++?

Quel peut être le meilleur algorithme pour générer un identifiant unique en C ++? L’ID de longueur doit être un entier non signé de 32 bits.

Obtenir un ID 32 bits unique est intuitivement simple: le suivant. Fonctionne 4 milliards de fois. Unique depuis 136 ans si vous en avez besoin d’une seconde. Le diable est dans les détails: quel était le précédent? Vous avez besoin d’un moyen fiable pour conserver la dernière valeur utilisée et d’un moyen atomique pour la mettre à jour.

La difficulté dépend de la scope de l’ID. S’il s’agit d’un thread dans un processus, vous n’avez besoin que d’un fichier. S’il s’agit de plusieurs threads dans un processus, vous avez besoin d’un fichier et d’un mutex. S’il y a plusieurs processus sur une machine, vous avez besoin d’un fichier et d’un mutex nommé. S’il s’agit de plusieurs processus sur plusieurs machines, vous devez affecter un fournisseur d’identifiant faisant autorité, un serveur unique auquel toutes les machines parlent. Un moteur de firebase database est un fournisseur commun comme celui-là, ils ont cela intégré en tant que fonctionnalité, une colonne à incrémentation automatique.

L’obtention de l’ID augmente progressivement au fur et à mesure que le champ d’application s’élargit. Lorsque cela devient impraticable, si Internet ou le fournisseur est trop lent ou indisponible, vous devez abandonner une valeur 32 bits. Basculer vers une valeur aléatoire. C’est assez aléatoire pour que la probabilité que la machine soit frappée par un meteor soit au moins un million de fois plus probable que de répéter la même identité. Un bon identifiant. Il est seulement 4 fois plus grand.

Voici l’identifiant le plus simple auquel je puisse penser.

MyObject obj; uint32_t id = reinterpret_cast(&obj); 

A tout moment, cet identifiant sera unique dans toute l’application. Aucun autre object ne sera situé à la même adresse. Bien entendu, si vous redémarrez l’application, un nouvel ID peut être atsortingbué à l’object. Et une fois la durée de vie de l’object terminée, le même ID peut être atsortingbué à un autre object.

Et des objects situés dans des espaces mémoire différents (par exemple, sur des ordinateurs différents) peuvent se voir atsortingbuer des ID identiques.

Enfin, si la taille du pointeur est supérieure à 32 bits, le mappage ne sera pas unique.

Mais comme nous ne soaps rien du type d’identité que vous souhaitez utiliser et de son caractère unique, cette réponse semble être la meilleure des réponses.

Vous pouvez voir ça . (La réponse complète, je pense, est sur Stack Overflow.)
Quelques notes pour un identifiant unique en C ++ sous Linux sur ce site . Et vous pouvez utiliser uuid sous Linux, voir cette page de manuel et cet exemple.

Si vous utilisez Windows et avez besoin des API Windows, consultez cette page MSDN .

Cette page Wikipedia est également utile: http://en.wikipedia.org/wiki/Universally_Unique_Identifier .

 DWORD uid = ::GetTickCount(); ::Sleep(100); 

Il y a peu de contexte, mais si vous recherchez un identifiant unique pour les objects de votre application, vous pouvez toujours utiliser une approche singleton similaire à

 class IDGenerator { public: static IDGenerator * instance (); uint32_t next () { return _id++; } private: IDGenerator () : _id(0) {} static IDGenerator * only_copy; uint32_t _id; } IDGenerator * IDGenerator::instance () { if (!only_copy) { only_copy = new IDGenerator(); } return only_copy; } 

Et maintenant, vous pouvez obtenir un identifiant unique à tout moment en faisant:

IDGenerator::instance()->next ()

Si vous pouvez vous permettre d’utiliser Boost, il existe une bibliothèque UUID qui devrait faire l’affaire. C’est très simple à utiliser – consultez la documentation et cette réponse .