robertroth: Zufallszahl

Beitrag lesen

Lieber Dennis, liebe Mitdenker, liebe Wissende, liebe Neugierige,

ja!

Das ist ja nett, dass Du nochmal versucht hast, alles zusammenzufassen. Warum Du aber scheinbar mein Posting von 20:07 übersehen hast, in dem ich bereits darauf hinwies, dass man mit uniqid() -> Handbuch keine echten Zufallszahlen erzeugen kann, weiß ich noch nicht.

Viel wichtiger ist aber, dass Ihr hier alle immer noch meinen Hinweis auf die **Nicht-**Einmaligkeit der Zeichenfolgen im Posting von 20:38 missachtet.

Kleines Testskript zum Ausprobieren:

<?php  ### unique_id.php ### Funktion uniqid() testen ### utf-8 

    header('Content-Type: text/html; CharSet=utf-8;');

    $_uniqueid = array();
    for ( $i = 0; $i < 5; $i++)
    {
	$_uniqueid[] = uniqid();
    }
		
    echo "<pre>\r\n";
    echo htmlspecialchars(print_r($_uniqueid, 1));
    echo "</pre>\r\n";

?>

Ich bekam da als Ausgabe:

Array
(
    [0] => 55278b89c9817
    [1] => 55278b89c9817
    [2] => 55278b89c9817
    [3] => 55278b89c9817
    [4] => 55278b89c9817
)

Warum ich die IDs erst in ein Array geschrieben habe? Weil die Ausgabe auf die Standardausgabe Zeit kostet und die wollte ich hier zwischen den Aufrufen der Funktion bewusst kurz halten!

Nun schauen wir uns das Ganze nochmal mit uniqid('', true) an:

Array
(
    [0] => 55278e43f3830
    [1] => 55278e43f3830
    [2] => 55278e43f3830
    [3] => 55278e43f3830
    [4] => 55278e43f3830
    [5] => 55278e43f38307.48271792
    [6] => 55278e43f38302.27676127
    [7] => 55278e43f38302.30131205
    [8] => 55278e43f38306.61604230
    [9] => 55278e43f38305.26805643
)

Von 0 bis 5 mit uniqid() und von 5 bis 9 mit uniqid('', true);

Mit der von mir vorgeschlagenen Verwendung von uniqid('', true) ist also die Einmaligkeit der Zeichenfolge (auf meinem Rechner) gewährleistet.

Will man nun noch die Erratbarkeit verschlechtern, müsste man z.B. noch einen String mit mt_rand() -> Handbuch voranstellen (oder anhängen).

<?php  ### unique_id.php ### Funktion uniqid() testen ### utf-8 ### ÄÖÜäöü

    header('Content-Type: text/html; CharSet=utf-8;');

    $_uniqueid = array();
    for ( $i = 0; $i < 5; $i++)
    {
	$_uniqueid[] = uniqid();
    }
	
    for ( $i = 0; $i < 5; $i++)
    {
	$_uniqueid[] = uniqid('', true);
    }
	
    for ( $i = 0; $i < 5; $i++)
    {
	$_uniqueid[] = uniqid(mt_rand(1,99999), true);
    }
	
    echo "<pre>\r\n";
    echo htmlspecialchars(print_r($_uniqueid, 1));
    echo "</pre>\r\n";

?>
Array
(
    [0] => 55278fb97caca
    [1] => 55278fb97caca
    [2] => 55278fb97caca
    [3] => 55278fb97caca
    [4] => 55278fb97caca
    [5] => 55278fb97caca1.12090844
    [6] => 55278fb97caca7.90725032
    [7] => 55278fb97caca8.19101436
    [8] => 55278fb97caca0.45335224
    [9] => 55278fb97caca3.08279841
    [10] => 6739155278fb97caca5.93560867
    [11] => 4116255278fb97caca5.86801685
    [12] => 6838855278fb97caca9.39616501
    [13] => 4891355278fb97caca3.30257003
    [14] => 486055278fb97caca4.84110264
)

Wie man in den Elementen 10 bis 14 unschwer erkennen kann, wird der String damit schwer erratbar und ist grantiert eineindeutig, solange es nur eine erzeugende Instanz gibt. Außerdem sieht man, dass bereits die kleine Zusatzaufgabe (mt_rand()) schon für eine neue Zeichenfolge im Stamm der von uniqid() erzeugten Zeichenkette sorgen kann.

Wenn man also nicht mit einem Uniqe-Index auf eine DBMS-Tabelle arbeiten kann, oder auch für das Anlegen von Dateien im Dateisystem nicht die Option 'x' benutzt (warum auch immer), und mit einem äußerst geringen restrisiko leben kann, dann ist das mMn die einzige Möglichkeit, die Anforderungen des OP zu erfüllen.

Spirituelle Grüße
Euer Robert
robert.r@online.de

--
Möge der wahre Forumsgeist ewig leben!