Mysql
 sql >> Database >  >> RDS >> Mysql

Generazione di ID univoci brevi PHP utilizzando auto_increment?

Avrai bisogno di qualcosa che sia corretto per costruzione, ad es. una funzione di permutazione:questa è una funzione che esegue una mappatura reversibile uno a uno di un numero intero (il tuo contatore sequenziale) a un altro. Alcuni esempi (qualsiasi combinazione di questi dovrebbe anche lavoro):

  • invertendo alcuni bit (es. usando un XOR, ^ in PHP)
  • scambiare le posizioni dei bit (($i &0xc)>> 2 | ($i &0x3) <<2), o semplicemente invertire l'ordine di tutti i bit
  • aggiungendo un valore costante modulo il tuo intervallo massimo (deve essere un fattore due, se lo stai combinando con quelli sopra)

Esempio:questa funzione converte 0, 1, 2, 3, 5, .. in 13, 4, 12, 7, 15, .. per numeri fino a 15:

$i=($input+97) & 0xf;
$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;

MODIFICA

Un modo più semplice sarebbe utilizzare un generatore congruenziale lineare (LCG, che viene solitamente utilizzato per generare numeri casuali), che è definito da una formula della forma:

X_n+1 = (a * X_n + c) mod m

Per buoni valori di a, c e m, la sequenza di X_0, X_1 .. X_m-1 conterrà tutti i numeri compresi tra 0 e m-1 esattamente una volta. Ora puoi iniziare da un indice linearmente crescente e utilizzare il successivo valore nella sequenza LCG come chiave "segreta".

EDIT2

Implementazione:puoi progettare i tuoi parametri LCG , ma se sbagli non coprirà l'intera gamma (e quindi avrà duplicati), quindi userò un set di parametri pubblicato e provato qui da questo documento :

a = 16807, c = 0, m = 2147483647

Questo ti dà un intervallo di 2**31. Con pack() puoi ottenere l'intero risultante come una stringa, base64_encode() lo rende una stringa leggibile (fino a 6 caratteri significativi, 6 bit per byte), quindi questa potrebbe essere la tua funzione:

substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)