Newsgroup: it.comp.www.php
Titolo: keygen

ho la necessita di generare un numero casuale che rispnde a delle regole
per fare un esempio il numero di carta di credito o il keygen di un progrmma
ovviamnte non deve essere "predicabile"
dove trovo info
un numero non molto lungo o stringa 5-6 caratteri in tutto



$zz=time();
mt_srand($zz);
$key = mt_rand(10000,99999);
ovviamente a parita' di time() restituisce sempre lo stesso valore.
Puoi eventualmente modificare $zz con un'altra generazione o elaborazione un po'
casuale. es $zz=time()+(num ip cliente * tempo di connessione) + valori extra
Ciao
Roberto


Parti da un numero e trasformalo come preferisci: devi stare attento al
metodo che utilizzi (non deve avere duplicati)
Esempio, creiamo un semplicissimo numero di questo tipo di 10 caratteri:
cifre 1,2,3,4,5: prendi un numero di 5 cifre a caso (da questo generi il
resto: se questo è unico il resto è ok)
cifra 6: prendi il resto della divisione (modulo) per 10 della somma della
cifra 1 e della cifra 3
cifra 7: prendi le decine dal prodotto della 2 e 4 cifra
cifra 8: parte intera della differenza tra la cifra 6 e la 7
cifre 9 e 10: le prime due cifre del risultato della somma tra ogni cifra
precedente
In pratica:
numero univoco: 42153
tutto il numero: 4215351425
numero univoco: 76535
tutto il numero: 
7653521130
Sarebbe anche da evitare di scrivere il codice univoco direttamente nel
risultato (mettendo però abbastanza informazioni da renderlo recuperabile
dal resto), oppure potresti metterlo in un ordine strano (4°,8°,6°,3° e 1°
cifra..)
Puoi ottenere codici anche molto complessi, sapendo un bel po' di matematica
e giocandoci un po' su.
Ludovico

 metodo che utilizzi (non deve avere duplicati)
fatto questo ha risolto il problema, tutto il resto è solo un esercizio 
mentale (o pippa mentale, se permetti)........
Ciao Gianfranzo
-- 
--
ICQ#: 21258924
Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
--

 un numero non molto lungo o stringa 5-6 caratteri in tutto
puoi provare a costruire un polinomio a rango massimo casuale di 
componenti con esponenti casuali, basi casuali e segni casuali e poi 
normalizzare nella forma che ti interessa.
esempio
non scrivo il codice altrimenti ci vuole troppo e non si capisce una 
mazza...
rango massimo 5 (è l'esponente di grado più alto, generato casualmente ) 
significa un polinomio del tipo a^5+b^4+c^3+d^2+e
in maniera casuale decidi quali dei 5 elementi del polinomio hanno 
valore per esempio considera un array da 0 a 4  con valori 0 o 1 
generati casualmente es (0,1,1,0,1) dove il primo elemento rappresenta 
il fattore di esponente 1 e l'ultimo quello di esponente massimo.
il tuo polimomio sarà del tipo a^5+c^3+d^2
dove a, c,d sono basi casuali.
Per rendere più "casuale" la generazione metti un bel (-1)^j dove j 
viene generato casualmente per ogni fattore del polinomio (in un range 
intero ampio a piacere).
(-1)^j1*a^5+(-1)^j2*c^3+(-1)^j3*d^2
dove j1,j2,j3 sono esponenti casuali.
il problema di questa forma è che se il rango è basso o i range delle 
basi e degli esponenti sono bassi puoi avere comunque duplicati, con una 
percentuale bassa, ma è sempre possibile... dovrai comunque verificare 
che tale codice non esiste già (magari se usi un db il problema è 
banale), ed eventualemnte rigenerare un nuovo codice.
io aggiungerei anche degli esponenti casuali entro il rango massimo, per 
aumentare la "casualità" ulteriormente e toglierei l'array che determina 
i fattori non nulli del polinomio.
per cui alla fine il polinomio che hai è del tipo:
(-1)^j1*a1^k1+(-1)^j2*a2^k2+(-1)^j3*a3^k3...+(-1)^jn*an^kn
dove n è il rango massimo del polinomio, j1..jn sono casuali,a1..an sono 
casuali e k1..kn sono casuali.
Sicuramente è più difficile che generi duplicati, resta il fatto che se 
il codice finale ha 6 cifre dovrai normalizzarlo e a questo punto hai 
k/999999 possibilità di ripetizione dove k è il numero di codici unici 
gia generati.
Non so se sono riuscito a spiegarmi bene, spero di si.


 mentale (o pippa mentale, se permetti)........
Certo, anche se lo definirei più un "esempio".
Ho usato un sistema simile per avere dei buoni codici-chiave: partendo da
numeri progressivi ne calcolavo un altro di 10 cifre. Potevo controllare la
validità del codice e, a seconda del metodo utilizzato, è risultava
abbastanza robusto da non permettere di generarne un'altro valido a chiunque
non conosca l'algoritmo.
Lo usavo per dare una chiave di accesso a delle persone: prendevo il loro id
nel database e creavo la chiave con cui potevano accedere... più semplice di
così!
Con il metodo stupido che ho scritto non c'è neanche possibilità di avere i
duplicati, se il numero da cui si parte è unico (come accade prendendo un id
univoco dal database).
Ludovico

 univoco dal database).
si, giusto, mancava solo questa "piccola" precisazione :)



Algoritmo MOD10  ? :)