Sie benötigen etwas, das konstruktionsbedingt korrekt ist, z Arbeit):
- Einige der Bits invertieren (z. B. mit einem XOR, ^ in PHP)
- Vertauschen der Bitstellen (($i &0xc)>> 2 | ($i &0x3) <<2), oder einfach die Reihenfolge aller Bits umkehren
- Hinzufügen eines konstanten Werts modulo zu Ihrer maximalen Reichweite (muss ein Faktor von zwei sein, wenn Sie dies mit den oben genannten kombinieren)
Beispiel:Diese Funktion konvertiert 0, 1, 2, 3, 5, .. in 13, 4, 12, 7, 15, .. für Zahlen bis 15:
$i=($input+97) & 0xf;
$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;
BEARBEITEN
Ein einfacherer Weg wäre die Verwendung eines linearen Kongruenzgenerators (LCG, der normalerweise zum Generieren von Zufallszahlen verwendet wird), der durch eine Formel der Form definiert ist:
X_n+1 = (a * X_n + c) mod m
Für gute Werte von a, c und m enthält die Folge von X_0, X_1 .. X_m-1 alle Zahlen zwischen 0 und m-1 genau einmal. Jetzt können Sie mit einem linear steigenden Index beginnen und next verwenden Wert in der LCG-Sequenz als Ihren "geheimen" Schlüssel.
BEARBEITEN2
Implementierung:Sie können Ihre eigenen LCG-Parameter entwerfen , aber wenn Sie es falsch machen, wird es nicht den gesamten Bereich abdecken (und daher Duplikate haben), also werde ich hier einen veröffentlichten und erprobten Satz von Parametern von dieses Dokument :
a = 16807, c = 0, m = 2147483647
Dies gibt Ihnen eine Reichweite von 2 ** 31. Mit pack() können Sie die resultierende Ganzzahl als String erhalten, base64_encode() macht daraus einen lesbaren String (mit bis zu 6 signifikanten Zeichen, 6 Bit pro Byte), also könnte dies Ihre Funktion sein:
substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)