Wenn man mit srand() seedet, erzeugt rand() immer die gleiche Zufallszahlenreihenfolge.
Ich sehe ganz deutlich das Wort "wenn". Ich sah in meinem Beispiel kein srand(). Was also, wenn nicht? Was also wenn nicht einmal bekannt ist, wann und wie oft rand() aufgerufen wurde um wann den salt für welchen Hash zu bilden? Richtig. Dann mischt der echte, software- und maschinenunabhängige Zufall genügend mit.
selbst ETWAS wie ein simples
srand(microtime(true) - intval(str_replace(' ','', str_replace('.','', file_get_contents('/proc/uptime')))));
dürfte einen Angreifer vor erhebliche Probleme stellen.
Aber wer sagt denn, dass man Rainbow-Tabellen erzeugen muss, wenn man durch unsicheren Zufall das Brute-Force einfacher haben kann?
Weil ja immer noch das Passwort aus einem Hash erraten werden muss und Rainbow-Tabellem für "lange" Strings wenig praktikabel sind?