Hallo, Am Fri, 08 Oct 2004, Jan Trippler schrieb:
Am Freitag, 8. Oktober 2004 14:23 schrieb David Haller:
Am Fri, 08 Oct 2004, Jan Trippler schrieb:
Am Donnerstag, 7. Oktober 2004 20:00 schrieb Daniel Lord: [..] Generell waere es besser, z.B. mit vier Bytes aus /dev/urandom zu initialisieren:
[snip Beispielcode]
Das wäre IMHO mit Kanonen auf Spatzen geschossen: - Die Wahrscheinlichkeit ist annähernd 0, dass man mehrmals / Sekunde Mails schickt (es sei denn, man ist Spammer)
Als einzelner: ja, unwahrscheinlich.
- Wenn die gleiche Signatur 2x hintereinander kommt: na und?
Ack. Deswegen mein Kommentar.
- Auch so ist es möglich, dass mehrmals die gleiche Signatur kommt, es sind eben Zufallszahlen - da können schon mal die gleichen Zahlen mehrmals fallen (je geringer die Anzahl der Signaturen, desto höher die Wahrscheinlichkeit).
Ja.
Man muss immer Aufwand und Nutzen gegeneinander abwägen. In diesem Fall ziehe ich Daniels Lösung definitiv vor. Wenn ich einen Programmaufruf so oft starten muss, dass ich mehrmals pro Sekunde einen Zufallswert brauche, dann implementiere ich ihn lieber als persistenten Dienst und initialisiere nur einmal.
Hast du daran gedacht, dass das Programm evtl. mehrere User "fast gleichzeitig" (innerhalb der selben Sekunde) aufrufen koennten? Das initialisieren aus /dev/urandom erschlaegt das Problem effektiv, ein Signature-Server (oder "persistenter Dienst") hingegen ist wesentlich komplexer zu programmieren. Als Zufallszahl, kann man schlicht die aus /dev/urandom gelesene verwenden. Die ist sowieso "besser". Und fuer echte Zufallszahlen ist rand(3) ja sowieso ungeeignet. rand(3) ist ja noch nichtmal ein guter PRNG (bzw. ist gar kein PRNG?). Brauche ich Zufallswerte, dann implementiere ich keinen Dienst, sondern lese einfach aus /dev/urandom! Denn das ist genau so ein "Dienst", der praktischerweise schon fertig im Kernel implementiert ist. Und brauche ich wirklich gute Zahlen gibt's noch /dev/random. Siehe /usr/src/linux/drivers/char/random.c. Insofern sollte man srand/rand also einfach vergessen, sofern man nicht _reproduzierbare_ Folgen pseudo-zufaelliger Zahlen _benoetigt_. Das letztere, naemlich die Eigenschaft reproduzierbare _Folgen_ von Zahlen zu produzieren, das hat /dev/{u,}random nicht. Wowereit. * Brauchst du sehr gute[1] Zufallszahlen? lies /dev/random. * Brauchst du gute Zufallszahlen? Lies /dev/urandom. * Brauchst du eine zufaellige Folge von zufaellig-aussehenden Zahlen: verwende srand/rand, initialisiert mit einer Zahl aus /dev/urandom. * Brauchst du eine Folge von zufaellig-aussehenden Zahlen: verwende srand/rand, initialisiert mit einer Zahl aus einer anderen Quelle. Fuer Signaturen reicht allerdings sicher der letzte Fall. Da reicht aber auch $RANDOM der bash (und anderer shells?). -dnh [1] kryptographisch gute -- Es fehlt die Glaskugel, die voraussagen kann, welche der anderen Glaskugeln heute am genauesten glaskugelt. -- Christoph Päper in drtm