Anda akan memerlukan sesuatu yang benar menurut konstruksinya, yaitu fungsi permutasi:ini adalah fungsi yang melakukan pemetaan satu-ke-satu yang dapat dibalik dari satu bilangan bulat (penghitung berurutan Anda) ke yang lain. Beberapa contoh (kombinasi apa pun dari ini juga harus kerja):
- membalikkan beberapa bit (fi menggunakan XOR, ^ dalam PHP)
- menukar tempat bit (($i &0xc)>> 2 | ($i &0x3) <<2), atau hanya membalik urutan semua bit
- menambahkan nilai konstan modulo rentang maksimum Anda (harus menjadi faktor dua, jika Anda menggabungkan ini dengan yang di atas)
Contoh:fungsi ini akan mengubah 0, 1, 2, 3, 5, .. menjadi 13, 4, 12, 7, 15, .. untuk angka hingga 15:
$i=($input+97) & 0xf;
$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;
EDIT
Cara yang lebih mudah adalah dengan menggunakan generator kongruensial linier (LCG, yang biasanya digunakan untuk menghasilkan bilangan acak), yang didefinisikan dengan rumus dalam bentuk:
X_n+1 = (a * X_n + c) mod m
Untuk nilai bagus dari a, c dan m, barisan dari X_0, X_1 .. X_m-1 akan memuat semua bilangan antara 0 dan m-1 tepat satu kali. Sekarang Anda dapat memulai dari indeks yang meningkat secara linier, dan menggunakan berikutnya nilai dalam urutan LCG sebagai kunci "rahasia" Anda.
EDIT2
Implementasi:Anda dapat mendesain parameter LCG Anda sendiri , tetapi jika Anda salah, itu tidak akan mencakup rentang penuh (dan karenanya memiliki duplikat) jadi saya akan menggunakan set parameter yang diterbitkan dan dicoba di sini dari makalah ini :
a = 16807, c = 0, m = 2147483647
Ini memberi Anda rentang 2**31. Dengan pack() Anda bisa mendapatkan integer yang dihasilkan sebagai string, base64_encode() menjadikannya string yang dapat dibaca (hingga 6 karakter signifikan, 6 bit per byte) jadi ini bisa menjadi fungsi Anda:
substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)