Unique ID generieren

kevkev

Erfahrenes Mitglied
Hallo,

Ich habe eine Seite bei der User Dateien hochladen können. Jeder download bekommt eine bestimmte ID.

Diese ID erstell ich durch dem hier:
PHP:
$keychars = "0123456789";
	$length = 10;
	$max=strlen($keychars)-1;
	
	for ($i=0;$i<=$length;$i++) {
		$randkey .= substr($keychars, rand(0, $max), 1);
	}
	
	$randkey = strtolower($randkey);

Funktioniert auch ohne probleme, aber ich will das gerne in eine funktion schreiben, bei der aber vorher überprüft wird, ob der erzeugte schlüßel schon exisitiert. wenn ja weiter geneierien, so lange bis ein schlüßel rauskommt, der nicht doppel vorkommt.

Aber stelle ich das an? Ich weiß überhaupt nix :(.

gruß kevin
 
Benutzt du die ID dann als Dateiname oder speicherst du die ID in einer Datenbank?

Bei ersterem:
Teste einfach schon eine Datei mit dem Namen im Verzeichnis existiert.
Die Funktion file_exists() wird dir da weiterhelfen.

Bei zweiterem:
Mach einfach eine Select-Abfrage, die nachguckt ob es schon einen Datensatz mit der ID gibt.

Um die Generier-Funktion kannst du eine while-Schleife machen, die so lange läuft bis er eine neue, eindeutige ID gefunden hat.

generelle idee:
PHP:
$gefunden = false;
while (!$gefunden) {
  $key = generieren();
  if (!schon_vorhanden($key)) {
    $gefunden = true;
 } 
}
 
Hi,

ok, so kommt zwar ne id raus, aber woher weiß ich, ob auch die funktion geht, falls es einen doppelten key gibt?
Wißt Ihr wie ich das am besten testen kann?

PHP:
	function id_generieren () {
		$keychars = "0123456789";
		$length = 10;
		$max=strlen($keychars)-1;
		
		for ($i=0;$i<=$length;$i++) {
			$randkey .= substr($keychars, rand(0, $max), 1);
		}
		
		$randkey = strtolower($randkey);
		
		return $randkey;
	}
	
	function id () {
		while(!is_dir("./files/".id_generieren()."/")){
	               return id_generieren();
		} // while
	}

gruß kevin
 
Hi,

Ach verdammt :)!
Warum kommst du so spät :), danke :)!

Und die ist ja wirklich dann total unqiue, da es undwarscheinlich ist, das jemand in der gleichen Zeit etwas hochlädt? Oder soll Ich die noch uniquier machen, in dem ich md5 (uniqid (rand())); anwenden? Oder reicht das so?

Gruß kevin
 
Da die uniqid()-Funktion die eindeutige ID auf der aktuellen Zeit in Mikrosekunden basierend generiert, ist es relativ unwahrscheinlich.
 
Zurück