2010-10-07 15 views

risposta

6

La quantità di informazioni che un intero PHP può memorizzare è limitata. La quantità di informazioni che è possibile memorizzare in una stringa non è (almeno se la stringa non è irragionevolmente lunga.)

Pertanto, è necessario comprimere la stringa di lunghezza arbitraria su un numero intero non arbitrario. Questo è impossibile senza perdita di dati.

È possibile utilizzare un algoritmo di hashing, ma gli algoritmi di hashing possono sempre avere collisioni. Soprattutto se si desidera eseguire l'hash di una stringa su un numero intero, la probabilità di collisione è piuttosto elevata: gli interi possono archiviare solo pochissimi dati.

Pertanto è necessario attenersi all'e-mail o utilizzare un campo intero incrementale automatico.

+0

puoi spiegare meglio la tua risposta in particolare l'ultimo paragrafo e grazie – jspeshu

+0

buon ragionamento devo dire, ma posso almeno trovare una funzione che lo farà ad es. ho un campo cioè email che è un VARCHAR (40) quindi dato che questi campi sono unici per tutti i valori piuttosto che usare un hash per evitare la collusione, aggiungerò qualche valore diciamo XXXX in modo che la loro lunghezza == 40 sia ancora unica, allora come posso avere un int esclusivo da questo – jspeshu

+2

Bene. Continuo a non pensare che troverai una funzione simile: una stringa di 40 caratteri può essere memorizzata in 40 byte (se è ascii, unicode impiegherà * ancora di più *). Un intero invece ha solo 8 byte (e solo su una macchina a 64 bit). Quindi avresti ancora bisogno di memorizzare 40 byte in 8 byte ... – NikiC

4

Prova la funzione binhex

dal sito di cui sopra:

<?php 
$str = "Hello world!"; 
echo bin2hex($str) . "<br />"; 
echo pack("H*",bin2hex($str)) . "<br />"; 
?> 

uscite

48656c6c6f20776f726c6421 
Hello world! 
+0

può che generare un int unica ora è vederlo "48656c6c6f20776f726c6421" un esagono o giù di lì – jspeshu

+0

dipende quanto grande sia l'int è però - che ha un valore int 5216694956355254127 –

2

Perché non basta avere un campo ID di incremento automatico sul database?

+0

non ho i db sto leggendo i dati dal server LDAP e l'unico campo unico è il loro indirizzo email – jspeshu

+2

+1 che è l'approccio corretto. nessuna magia di corde. – NikiC

+0

Non hai davvero bisogno di un DB per questo approccio, suppongo che potresti avere un incremento di file di testo per ogni categoria di incrementi di nome file. – Vass

0

Se le e-mail sono testo ascii, è possibile utilizzare PHP ord function per generare un numero intero univoco, ma sarà un numero molto grande!

L'approccio sarebbe quello di lavorare attraverso l'indirizzo di posta elettronica di un carattere alla volta, chiamando ord per ciascuno di essi. La funzione ord restituisce un intero che esprime in modo univoco il valore del carattere. È possibile riempire ciascuno di questi numeri con zeri e quindi utilizzare la concatenazione di stringhe per collegarli l'uno all'altro.

Considerare "abc".

ord("a"); 
>> 97 

ord("b"); 
>> 98 

ord("c"); 
>> 99 

Pad questi numeri con 0, e si dispone di un numero unico per esso, cioè: 970980990.

Mi auguro che aiuta!

+0

come circa la limitazione della lunghezza, ad es. che ne dici di questa email "[email protected]" c'è un int equivalente per questo io non penso che b/se php abbia qualche costante chiamato PHP_MAX_INT o qualcosa del genere – jspeshu

+0

Sì, questo sarà il problema da superare. Come tutti dicono, questo non è il modo giusto per farlo: volevo solo evidenziare un approccio nel caso in cui ciò fosse d'aiuto. – adamnfish

-1

perché non creare la propria tabella associativa a livello locale che legherà le email con numeri interi unici?

Così il flusso di lavoro sarebbe nelle linee di:

1 get the record from the ldap server. 
2 check it locally if it has already an int assigned. 
2.1 if yes use that int. 
2.2 if no, generate an associative row in the table locally. 
3 do your things with the unique ids. 

Ha senso?

+0

scusate ma non ha ottenuto che ... – jspeshu

+0

L'unico modo per mantenere un'associazione tra le vostre e-mail e un elenco di numeri interi è avere un livello persistente (un database per esempio) che funzionerà come un mappatore tra le vostre e-mail e i numeri. Quindi crea la tua tabella di database o file localmente e memorizza i dati in questo modo: [email protected] = 1001, [email protected] = 1002, ecc. – Slavic

+0

che è quello che voglio evitare e che cosa mi ha portato a questa domanda? ma grazie penso che questo ragazzo @nikic lo abbia capito – jspeshu

-1

È possibile utilizzare questa funzione:

function stringToInteger($string) { 
    $output = ''; 
    for ($i = 0; $i < strlen($string); $i++) { 
     $output .= (string) ord($string[$i]); 
    } 
    return (int) $output; 
} 

un po 'brutto, ma funziona :)

+1

tu potrebbe voler convertire prima tutti gli indirizzi e-mail in minuscolo, in modo da ottenere sempre un valore di stringa consistente (strtolower) – Hightower

+0

il cast (int) non è corretto, poiché restituirà sempre il valore int massimo per stringhe lunghe – Rajesh

1

Questo codice genera il numero a 64 bit che può essere utilizzato in quanto o come BIGINT/simile tipo di dati per database come MySQL ecc.

function get64BitNumber($str) 
{ 
    return gmp_strval(gmp_init(substr(md5($str), 0, 16), 16), 10); 
} 

echo get64BitNumber('Hello World!'); // 17079728445181560374 
echo get64BitNumber('Hello World#'); // 2208921763183434891 
echo get64BitNumber('http://waqaralamgir.tk/'); // 12007604953204508983 
echo get64BitNumber('12345678910'); // 4841164765122470932 
Problemi correlati