Génération d’un identifiant unique

On a souvent besoin de générer un nom (chaine) unique en PHP ou avec d’autres langages quand on doit créer un identifiant de session ou un nom de fichier …


Prenons un cas simple ou l’on place des fichiers téléchargés dans un répertoire, le nom du fichier de destination n’est pas vraiment important puisque les données utiles sont la plupart du temps stockés dans une BD.

Pour être certain de générer un nom de fichier unique :

  1. on commence par créer une chaine aléatoire ou accoler au nom du fichier source une partie aléatoire
  2. on vérifie que le répertoire de destination ne comporte pas un fichier de ce nom
  3. si la condition précédente est fausse, on recommence du début.

le code le plus simple ressemble a ceci :

$nomFichierSource = 'Linux Cookbook.djvu';
$nomUnique = '';
 
do {
	$nomUnique = md5($nomFichierSource . microtime() . mt_rand());
} while( file_exists('repertoire_destination/' . $nomUnique) == true );
 
print($nomUnique);

On peut améliorer ce code de manière à garder le nom du fichier et l’extension :

$nomFichierSource = 'Linux Cookbook.djvu';
$nomUnique = '';
 
do {
	if( substr_count($nomFichierSource, '.') ){
		$nomUnique = substr($nomFichierSource, 0, strrpos($nomFichierSource, '.')) . '_' .
			md5($nomFichierSource . microtime() . mt_rand()) .
			substr($nomFichierSource, strrpos($nomFichierSource, '.'));
	}else{
		$nomUnique = $nomFichierSource . '_' . md5($nomFichierSource.microtime());
	}
} while( file_exists('repertoire_destination/'.$nomUnique) == true );
 
print($nomUnique);

nb : mt_rand() accolé à microtime() est la pour renforcer le caractère aléatoire, mais ne serait utile que pour un site qui aurait à gérer l’enregistrement de milliers de fichiers a la seconde.

nb2 : Ces 2 bouts de code ne prennent pas en compte toutes les sécurités à placer sur un nom de fichier venant d’une source externe car ce n’est pas le but de cet article.


Un autre besoin d’identifiant unique que l’on rencontre couramment, c’est lors de création de session afin d’authentifier un client.

La logique reste la même, lors de la création de l’identifiant unique on vérifie s’il est utilisé et si c’est le cas on recommence la phase de création.

Exemple :

mysql_connect("localhost", "root", "");
mysql_select_db("ma_base");
 
$idSession = '';
 
do {
	$idSession = md5( $_SERVER['REMOTE_ADDR'] . microtime() . mt_rand() );
	$retour = mysql_query("SELECT 1 FROM sessions where session_id ='$idSession' ");
} while( mysql_fetch_row($retour) == '1' );
 
print($idSession);

Ce script ce connecte à une BD MySQL pour vérifier que l’identifiant de session qui vient d’être généré n’est pas utilisé.

Laisser un commentaire

*