2009-10-20 12 views
0

J'ai besoin d'un générateur UUID simple. L'ID doit être unique pour cette instance unique. Une autre exigence est, qu'il a n hachages coexistent à la fois, et être libérable. Je ne sais pas si cela correspond ou non au concept UUID. J'ai tout de suite pensé à une pile avec des valeurs n utilisant le pop et le push, mais cette pratique me semble mauvaise mémoire. L'utilisation d'UUID aléatoires (à l'exclusion des UDI cryptographiques) n'est pas suffisante, car par malchance, il pourrait y avoir 2 IDs correspondants, qui ne peuvent pas être accapet (bien que neglegable chance), car cela est supposé être utilisé dans un environnement productif.Générateur d'UUID n-values, ID réutilisables

+0

Vous voulez élaborer ce dont vous avez besoin exactement ici? Je ne comprends pas au moins la moitié de ce que vous dites. Notez également que les GUID * sont en fait utilisés dans les environnements de production, même s'il y a une chance qu'ils puissent entrer en collision. – Joey

+2

Pour le mettre en perspective: même si un serveur n'a fait que générer des UUID pendant toute sa durée de vie, le plus grand risque est qu'il soit effacé par un météore. – MSalters

+0

Eh bien, merci pour votre temps. Est-ce même donné avec/dev/random sous unix. J'ai lu de nombreux articles qui n'étaient pas aussi aléatoires que ce qu'ils étaient censés être, et quuid, que j'ai d'abord essayé d'utiliser, utilise celui-là (pour autant que je sache). Merci pour votre réponse. – drahnr

Répondre

1

Universellement Identifiers unique (UUID)/À l'échelle mondiale Identificateur unique (GUID)

Le problème de la génération d'identifiants uniques peut être décomposé en unicité sur l'espace et unicité dans le temps qui, lorsqu'ils sont combinés, visent à produire une séquence globalement unique.

Les UUID sont officiellement et spécifiquement définis dans la norme ISO-11578. D'autres spécifications existent également, comme RFC 4122, Rec. X.667.

OSSP uuid (http://www.ossp.org/pkg/lib/uuid/) est une API pour C ISO, ISO C++, Perl et PHP et un CLI correspondant pour la production de DCE 1,1, ISO/CEI 11578: 1996, et RFC4122 Conforme identificateurs uniques universels (UUID). Il prend en charge les UUID de variante 1 de DCE version 1 (temps et nœud), version 3 (nom basé, MD5), version 4 (basée sur un nombre aléatoire) et version 5 (basée sur le nom, SHA-1). Les UUID sont des nombres de 128 bits qui sont destinés à avoir une forte probabilité d'unicité dans l'espace et le temps et sont difficiles à deviner. Ce sont des identifiants globalement uniques qui peuvent être générés localement sans contacter une autorité d'enregistrement globale. Il est Open Source sous licence MIT/X Consortium.

J'ai inclus quelques explications supplémentaires dans le http://en.wikibooks.org/wiki/The_World_of_Peer-to-Peer_%28P2P%29/Building_a_P2P_System#Unique_ID

Sur Windows Vérifiez la bibliothèque RPC (voir #include « rpcdce.h ») il a des fonctions pour générer UUID.

+1

J'ai effectivement calculé la probabilité de collision et il est dans la gamme ov 10^-33, donc je suppose que je peux ignorer les ID en double. Merci pour votre réponse, il clarifié beaucoup. – drahnr

2

Je recommande fortement this bibliothèque, c'est un candidat boost - nous l'utilisons dans un de nos projets et ça marche très bien. Le lien est à v13. Cette version + d'autres versions peuvent être situées à www.boostpro.com

Exemple:

#include <string> 
#include <iostream> 
#include <UUID/boost/uuid/uuid.hpp> 
using namespace std; 

/*! returns a filename which is a uuid + .dat*/ 
std::string generate_filename() 
{ 
    boost::uuids::uuid_generator gen; 
    boost::uuids::uuid u = gen(); 
    return u.to_string()+ ".dat"; 
} 

void main() 
{ 
    for(int i = 0; i < 10; i++) 
     cout << generate_filename() << endl; 
} 

Si c'est ce que vous cherchez, s'il vous plaît marquer ce message comme une réponse :)

+0

edit - a ajouté un exemple – Maciek

+3

Cela génère des UUID v4 basés sur des aléas, ce qui n'est pas mieux que 'QUuid :: createUuid()'. –

+0

Donc, ce n'est pas une solution, les Uuids basés au hasard ne sont pas une option. Les objets auxquels j'attribue les UUID sont créés et tués * très * fréquemment, mais il y a un maximum d'objets N qui ont un UUID défini à la fois. Merci pour votre réponse. – drahnr