Comment générer un GUID dans C?
Je veux générer des guid pour les insérer dans une base de données SQLite (c'est à dire pas de soutien de la bd elle-même). Cependant, je voudrais avoir le contrôle sur certaines propriétés:
- Orderedness pour générer de l'augmentation des valeurs guid.
- Ordinateur de l'indépendance. La db est public et peut/ne peut pas vouloir guid pour permettre à quelqu'un à la trace des données à une machine spécifique.
- Suffisamment aléatoire. Les guid sont des clés dans la base de données qui va être fusionné avec beaucoup d'autres dbs et peut-être assez grande, ce qui signifie que semblant un guid à l'instar de nombreux algorithmes n'est pas bon.
- Je peux faire face à l'utilisation du système des Api spécifiques, mais s'il vous plaît lien à la fois Windows et Linux et de fonctions, et quelque chose comme SQLite est préféré, où je peux utiliser le code de quelqu'un d'autre a écrit.
- Je préfère également le code qui est OK pour une utilisation dans des applications commerciales.
double possible de Simple Génération de GUID en C
OriginalL'auteur chacham15 | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soit utiliser ou de regarder le code de Boost.Uuid :
http://www.boost.org/doc/libs/1_47_0/libs/uuid/index.html
C'est une bibliothèque C++, mais encore, vous pouvez le trouver à l'intérieur de la façon dont le code de l'auteur (extrait de l'Uuid sur plusieurs systèmes. La dernière fois que j'ai vérifié (janvier 2010), j'ai trouvé au moins les implémentations suivantes pour Windows et Linux/Solaris (cette info pourrait être obsolète):
UUID/GUID sur Linux/Solaris
Ouvrir un fichier
/dev/urandom
et de lire assez d'octets (16) pour créer un GUID/UUID.UUID/GUID sur Windows
Utilisation suivantes WinAPI fonctions
D'autres implémentations
La page de Wikipedia sur GUID/UUID a une liste des implémentations alternatives que vous pourriez utiliser/étude:
https://en.wikipedia.org/wiki/UUID#Implementations
Au sujet de vos conditions de
Il y a un GUID/UUID type qui est toujours aléatoire (la la version 4), ce qui signifie que pour être compatible avec d'autres GUID/UUID de la sémantique, vous devez la respecter.
Maintenant, vous voulez le GUID/UUID pour être ordonnés dans le temps. La seule façon de le faire, sans l'affaiblir, le GUID/UUID aléatoire serait de faire précéder le GUID de 16 octets/UUID avec un entier non signé (ce qui rendrait votre identifiant de données de 20 octets, ou plus, selon votre entier). Tout simplement de générer un GUID/UUID, et d'augmenter le nombre entier.
est assez petit sur linux qu'il n'a pas besoin du coup de pouce uuid mécanisme : N'est-ce pas ce que ma réponse était sur? Regarder coup de pouce à voir/extrait de comment il a été fait sur chaque plate-forme?...
OriginalL'auteur paercebal
Un lieu de chercher une réponse à la création d'un GUID qui contient de nombreux éléments de l'auteur est à la recherche d'est en PHP .. http://us3.php.net/uniqid .. Dans leurs exemples, ils discutent de la façon d'ajouter un serveur de noms, de noms de base de données, et d'autres éléments à un GUID.
Toutefois, pour répondre à la nécessité d'un C GUID fonction, voici le code basé sur une fonction JavaScript .. Créer un GUID /UUID en JavaScript? .. cet exemple utilise les RegEx pour créer le GUID.
Ci-dessous est le code qui permettra de créer un GUID basé sur l'exemple en JavaSCript. Je suis sûr qu'il y a de plus élégant des solutions. C'est quelque chose bricolé pour aider à donner un exemple propre à suivre pour les autres.
Remarque: les chaînes de caractères à la fin avec un 0x00 caractère.
Ceci est une version 4 au hasard UUID et est parfaitement valide.
Eh bien, valide, sauf pour les très faibles aléatoire de semis.
Pourrait être améliorée en remplaçant les deux derniers cas, avec
default: break;
, l'initialisation dec = szTemp[t]
et le remplacement deswitch (c)
.OriginalL'auteur E Net Arch
Tout d'abord, les Guid ne sont pas aléatoires, ils sont très bien définis mathmatically.
Comme pour votre problème, mettre le GUID de la création dans la base de données elle-même qu'une procédure stockée, de cette façon, le système est indépendant de la plateforme. Ensuite, faites le GUID d'un auto-incrémentation entier préfixé avec un ID de base de données. Le préfixe permet de bases de données à fusionner facilement. La base de données ID doit être unique pour chaque base de données. Si vous contrôlez chaque base de données alors c'est simple pour s'assurer qu'elles sont uniques. Sinon, vous pourriez avoir besoin d'un système de recherche qui associe à la base de données de l'adresse IP (ou un autre identificateur unique) à un unique ID de base de données.
Si vous n'avez pas de procédures stockées puis créer une table avec "NextIndex" et "DatabaseID" champs et les mettre à jour lorsqu'un nouvel enregistrement est ajouté:
l'ID de base de données peut être une adresse MAC, un système d'exploitation générés GUID, etc
OriginalL'auteur Skizz