my $id = sprintf("%6s", sha1_base64( time() ) );
Wie ich schon Martin fragte, ob das reicht, könnten dann die 6 Zeichen nicht mehrfach vorkommen? Sonst wäre das genau perfekt.
Die Wahrscheinlichkeit einer Kollision entspricht der Bittiefe, wobei base_64 dir eine websichere bittiefe gibt, also 6 der 8 Bits.
time() ergibt eine Fliesskommazahl mit 9 Stellen vor dem Komma (nur 4 Stellen sind für den tag relevant) und 4 bis 7 Stellen nach dem Komma.
Zusammen also 13 bis 17 bits. 3 Dezimalstellen entsprechen 10bits. Du hast also hier mindestens 30 bits.
Wie immer bei ids kannst du das verbessern durch
my $id = sprintf("%6s", sha1_base64( time() . rand() . "Salzstengel" ) );
Die Auflösung aber reicht, dass der hash zuerst einmal sicher ist.
Da uniqueness nur pro Tag gefordert wird, ist die Wahrscheinlichkeit für Kollisionen gering. Du kannst mit einem Raum von 6 x 3 Bits rechnen.
Dieser Raum wird durch den time() input nicht ganz ausgeschöpft, durch sich das zu etwa 14 bits verringert.
Die Wahrscheinlichkeit für eine Kollission pro tag ist Abhängig von der Erwarteten Menge an zu produzierenden IDs.
Dies nur als grobe Schätzung.
Wenn du mehr Willst musst du mehr Zeichen-Raum zulassen.
mfg Beat
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
Der Valigator leibt diese Fische