Le premier site francophone dédié au développement Pocket PC

Comment générer un pseudo GUID ?
Auteur
Stéphane Sibué
Date 15 novembre 2002
 
   


Un GUID, kézako ?

Un GUID (globally unique identifier) est un identifiant qui en théorie est unique dans le sens où il n'y en a pas deux identiques sur tout le parc informatique mondial.

Les GUID sont donc utilisés dès qu'un identifiant unique (globalement unique) est nécessaire. On les retrouve donc dans la gestion des composants ActiveX, dans la gestion des bases de données, et dans beaucoup d'applications Internet.

Dans un GUID il y a quoi ?

Dans le détail je ne sais pas. Tout ce que je sais c'est que lorsqu'un GUID est généré, un certains nombre de paramètres liés à la date et l'heure, ainsi que certains numéros de série matériels de la machines génératrice sont mis à contribution (par exemple, chaque carte réseau à un adresse MAC unique), ce qui permet de générer un identifiant unique.

Composer son propre GUID

Perso j'utilise souvent les pseudo GUID pour la gestion des bases de données. Ceci me permet d'être quasi certain (mon algo n'est surement pas parfait) que mes enregistrements bénéficient d'un identifiant unique et que je peux sans soucis mélanger des données qui proviennent de plusieurs Pocket PC dans une base centrale sans rencontrer le problème des clés en double (et un soucis de moins).

Le principe mis en oeuvre

Dans l'algo que je vous propose (il peut être adapté dans tous les langages en fait), j'utilise les infos suivantes :

L'année, le mois et le jour
L'heure, les minutes et les secondes
Un nombre aléatoire compris entre 1 et 65530

Le tout est écrit en héxadécimal et copieusement brassé pour générer une chaine (oui oui une chaine, pas un tableau d'octets) qui ressemble un peu à ça :

"07D2-045A-0456-14-021E-50"

On a besoin de 3 fonctions

Pour créer ce pseudo GUID nous avons besoin d'implémenter 3 fonctions.

La première permet de formater des nombres en hexadécimal avec un nombre de digits défini :

Public Function Hexa(ByVal wNumber As Long, _ 
ByVal wDigits As Integer) As String
 Dim wBuffer As String
               
 wBuffer = Hex(wNumber)
 If Len(wBuffer) > wDigits Then
  wBuffer = Mid(wBuffer, Len(wBuffer) - wDigits, wDigits)
 ElseIf Len(wBuffer) < wDigits Then
  wBuffer = String(wDigits - Len(wBuffer), "0") & wBuffer
 End If
               
 Hexa = wBuffer

End Function

La seconde fait la même chose mais avec les nombres décimaux :

Public Function Formater(ByVal wNombre As Long, _ 
ByVal wDigits As Integer) As String
 Dim wBuffer As String
               
 wBuffer = wNombre
 If Len(wBuffer) > wDigits Then
  wBuffer = Right(wBuffer, wDigits)
 ElseIf Len(wBuffer) < wDigits Then
  wBuffer = String(wDigits - Len(wBuffer), "0") & wBuffer
 End If
               
 Formater = wBuffer
End Function

La troisième enfin permet de générer le pseudo GUID et utilise les deux précédentes :

Public Function MakeGUID() As String             
 Dim wBuffer As String
 Dim wNombre As Long
 Dim wGUID As String
               
 Call Randomize(Timer)
 wBuffer = Formater(Year(Now), 4) & Formater(Month(Now), 2)
 wBuffer = wBuffer & Formater(Day(Now), 2)
 wBuffer = wBuffer & Formater(Hour(Now), 2) & Formater(Minute(Now), 2)
 wBuffer = wBuffer & Formater(Second(Now), 2)
 wBuffer = wBuffer & Formater(Int(Rnd() * 65530#) + 1, 6)
               
 wGUID = Hexa(Mid(wBuffer, 1, 4), 4)
 wGUID = wGUID & "-" & Hexa(Mid(wBuffer, 5, 4), 4)
 wGUID = wGUID & "-" & Hexa(Mid(wBuffer, 9, 4), 4)
 wGUID = wGUID & "-" & Hexa(Mid(wBuffer, 13, 2),  2)
 wGUID = wGUID & "-" & Hexa(Mid(wBuffer, 15, 4),  4)
 wGUID = wGUID & "-" & Hexa(Mid(wBuffer, 19, 2),  2)
 
 MakeGUID = wGUID
End Function

Y a plus qu'à

A partir de maintenant, si vous avez ajouté ces 3 fonctions dans votre code eVB, il est très simple de générer un pseudo GUID en tapant simplement cette ligne de code :

Dim wGUID As String

wGUID = MakeGUID()

Important : Dans vos bases de données, prévoyez un champ texte de 25 caractères pour y stocker le GUID.

Conclusion

Il est certain que cet algo n'est pas parfait, mais je l'utilise dans mes développements depuis longtemps maintenant et je n'ai jamais eu de problème. J'espère qu'il pourra vous servir à votre tour.

Si vous avez des remarques (constructives bien sûr) sur ce sujet ou des problèmes avec ces algo n'hésitez pas à poster vos messages sur les forums CodePPC.

Stéphane Sibué

 

 
   

Copyright 2001-2004 - Tous droits réservés
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.