COMMENT GÉNÉRER UN MOT DE PASSE ALÉATOIRE EN ÉVITANT AU MIEUX LES DOUBLONS ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
1 mai 2004 à 09:43
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015
-
7 mai 2004 à 22:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 7 mai 2004 à 22:21
les probabilités de doublon de GUID sont : 1 sur 6,3340286662973277706162286946812e+49
(sachant que l'on a 32 caractères avec 36 possibilités pour chacun)
c'est à dire 36 exposant 32. Ceci explique la quasi-impossibilité de doublon
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 7 mai 2004 à 22:14
Je m'étais amusé (suite à la recherche qu'éffectuait DevelOpeR13
) à faire une fonction sans déclaration de variable (pour m'amuser)
________________
Function CreateGUID:string;
begin
Randomize;
while length(result)<36 do
begin
case random(2) of
0:Result := Result +chr(random(10)+48);
1:Result := Result +chr(random(26)+65);
end;
case length(result) of
8,13,18,23:Result:=Result+'-';
end;
end;
end;
________________
sinon, il y avait aussi (par curiosité):
____________________
(avec ComObj, ActiveX, )
function CreateGuid: string;
var
ID: TGUID;
begin
Result := '';
if CoCreateGuid(ID) = S_OK then
Result := GUIDToString(ID);
end;
____________________
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 2 mai 2004 à 10:49
Voilà qu'en 2 secondes vous démystifiez complètement les CLID à mes yeux :-). Depuis des années, je me suis toujours demandé comment ceux-ci étaient générés et surtout comment ils faisaient pour ne pas être identique à un autre :s .
Je vous remercie tous les deux pour m'avoir éclairé à ce sujet.
ChapeauBonnet bas.
Inekman. 10/10
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 1 mai 2004 à 14:59
Je ne vois absolument pas où il manque une affectation, du moins dans le code que j'ai téléchargé hier.
DevelOpeR13
Messages postés7Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention 4 octobre 2004 1 mai 2004 à 14:16
non je crois qu'il manque un result :='' à la fonction
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 1 mai 2004 à 09:51
Je viens aussi de m'apercevoir que ta routine générait souvent des chaines de caractères identiques. Pour améliorer la sortie, il est préférable de faire une appel à la fonction Randomize comme ceci :
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Randomize;
// Exemple type CLID => FA1BA083-5B86-48F9-9DD3-CF3DA9EEC4F6
Edit1.Text := RandomPassword(8)+'-'+RandomPassword(4)+'-'+RandomPassword(4)+'-'+RandomPassword(4)+'-'+RandomPassword(12);
end;
au lieu de réinitialiser le générateur de nombres aléatoires à chaque série de caractères.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 1 mai 2004 à 09:43
Pour obtenir un mot de passe unique à coup sur, on peut utiliser les fonctions de créations d'identificateur unique (CLSID) comme ceci :
{ajouter SysUtils à la clause Uses}
procedure TForm1.Button1Click(Sender: TObject);
var
Guid: TGuid;
Password: string;
begin
//Création d'un identificateur unique
CreateGuid(Guid);
//Transformation en une chaine
Password := GuidToString(Guid);
//retire les accolades à chaque bout
Edit1.Text := Copy(Password, 2, Length(Password)-2);
end;
L'utilisation de ce code ne donnera jamais de code identique sur une même machine tout comme sur des milliers d'ordinateurs à travers le monde.
Le plus dur n'est pas de générer un mot de passe mais qu'il soit facile à retenir ! :o(
7 mai 2004 à 22:21
(sachant que l'on a 32 caractères avec 36 possibilités pour chacun)
c'est à dire 36 exposant 32. Ceci explique la quasi-impossibilité de doublon
7 mai 2004 à 22:14
) à faire une fonction sans déclaration de variable (pour m'amuser)
________________
Function CreateGUID:string;
begin
Randomize;
while length(result)<36 do
begin
case random(2) of
0:Result := Result +chr(random(10)+48);
1:Result := Result +chr(random(26)+65);
end;
case length(result) of
8,13,18,23:Result:=Result+'-';
end;
end;
end;
________________
sinon, il y avait aussi (par curiosité):
____________________
(avec ComObj, ActiveX, )
function CreateGuid: string;
var
ID: TGUID;
begin
Result := '';
if CoCreateGuid(ID) = S_OK then
Result := GUIDToString(ID);
end;
____________________
2 mai 2004 à 10:49
Je vous remercie tous les deux pour m'avoir éclairé à ce sujet.
ChapeauBonnet bas.
Inekman. 10/10
1 mai 2004 à 14:59
1 mai 2004 à 14:16
1 mai 2004 à 09:51
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Randomize;
// Exemple type CLID => FA1BA083-5B86-48F9-9DD3-CF3DA9EEC4F6
Edit1.Text := RandomPassword(8)+'-'+RandomPassword(4)+'-'+RandomPassword(4)+'-'+RandomPassword(4)+'-'+RandomPassword(12);
end;
au lieu de réinitialiser le générateur de nombres aléatoires à chaque série de caractères.
1 mai 2004 à 09:43
{ajouter SysUtils à la clause Uses}
procedure TForm1.Button1Click(Sender: TObject);
var
Guid: TGuid;
Password: string;
begin
//Création d'un identificateur unique
CreateGuid(Guid);
//Transformation en une chaine
Password := GuidToString(Guid);
//retire les accolades à chaque bout
Edit1.Text := Copy(Password, 2, Length(Password)-2);
end;
L'utilisation de ce code ne donnera jamais de code identique sur une même machine tout comme sur des milliers d'ordinateurs à travers le monde.
Le plus dur n'est pas de générer un mot de passe mais qu'il soit facile à retenir ! :o(