2010-10-07 13 views

Antwort

6

Die Menge an Informationen, die eine PHP-Ganzzahl speichern kann, ist begrenzt. Die Menge der Informationen, die Sie in einer Zeichenkette speichern können, ist nicht (zumindest wenn die Zeichenkette nicht unangemessen lang ist).

Sie müssten also Ihre Zeichenfolge mit beliebiger Länge zu einer Ganzzahl mit beliebiger Länge komprimieren. Dies ist unmöglich ohne Datenverlust.

Sie können einen Hashing-Algorithmus verwenden, Hashing-Algorithmen können jedoch immer Kollisionen haben. Besonders wenn Sie eine Zeichenkette auf eine ganze Zahl hashen wollen, ist die Kollisionswahrscheinlichkeit ziemlich hoch - ganze Zahlen können nur sehr wenig Daten speichern.

Sie sollten also entweder mit der E-Mail bleiben oder ein automatisch inkrementierendes Integer-Feld verwenden.

+0

können Sie Ihre Antwort besser vor allem den letzten Absatz zu erklären und danke – jspeshu

+0

gute Argumentation ich muss sagen, aber kann ich @ mindestens eine Funktion finden, die dies tun wird, z. Ich habe ein Feld, dh E-Mail, die ein VARCHAR (40) ist, da dieses Feld für alle Werte eindeutig ist, anstatt einen Hash zu verwenden, um Kollusion zu vermeiden, werde ich etwas Wert sagen XXXX, so dass ihre Länge == 40 noch eindeutig ist, dann wie kann ich einen einzigartigen int aus diesem – jspeshu

+2

Well haben. Ich denke immer noch nicht, dass Sie eine solche Funktion finden werden: Eine Zeichenfolge mit 40 Zeichen kann in 40 Bytes gespeichert werden (wenn es ASCII ist, wird Unicode * noch mehr *). Eine ganze Zahl hat dagegen nur 8 Bytes (und das nur auf einer 64-Bit-Maschine). So müssten Sie immer noch 40 Bytes in 8 Bytes speichern ... – NikiC

4

Versuchen Sie, die binhex Funktion

vom oben genannten Standort:

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

Ausgänge

48656c6c6f20776f726c6421 
Hello world! 
+0

kann es jetzt eine einzigartige int erzeugen, ist es sehen „48656c6c6f20776f726c6421“ ein hex oder so – jspeshu

+0

abhängt, wie groß der int allerdings ist - das einen int-Wert hat 5216694956355254127 –

2

Warum auf der Datenbank nicht nur ein Auto-Inkrement-ID-Feld hat?

+0

ich keine db ich habe Ich lese die Daten von LDAP-Server und das einzige eindeutige Feld ist ihre E-Mail-Adresse – jspeshu

+2

+1 das ist der richtige Ansatz. keine String-Magie. – NikiC

+0

Sie brauchen nicht wirklich eine DB für diesen Ansatz, ich denke, Sie könnten eine Textdatei inkrement für jede Kategorie von Dateinamen Inkrementen haben. – Vass

0

Wenn die E-Mails ascii Text sind, könnten Sie PHP ord function verwenden, um eine eindeutige ganze Zahl zu generieren, aber es wird eine sehr große Zahl sein!

Der Ansatz wäre, die E-Mail-Adresse ein Zeichen nach dem anderen abzuarbeiten, ord für jedes von ihnen anzurufen. Die Funktion ord gibt eine Ganzzahl zurück, die den Wert des Zeichens eindeutig ausdrückt. Sie können jede dieser Zahlen mit Nullen auffüllen und dann die Verkettung der Zeichenketten verwenden, um sie miteinander zu verbinden.

Betrachten Sie "abc".

ord("a"); 
>> 97 

ord("b"); 
>> 98 

ord("c"); 
>> 99 

Pad diese Zahlen mit 0, und Sie haben eine eindeutige Nummer für sie, das heißt: 970980990.

Ich hoffe, dass hilft!

+0

wie über die Längenbeschränkung z. wie wäre es mit dieser E-Mail "[email protected]" gibt es eine äquivalente Int für diese ich glaube nicht, dass b/se PHP eine Konstante namens PHP_MAX_INT oder so ähnlich hat – jspeshu

+0

Ja, das ist das Problem zu überwinden. Wie alle sagen, ist dies nicht der richtige Weg, um dies zu tun - ich wollte nur einen Ansatz hervorheben, falls das hilft. – adamnfish

-1

Warum erstellen Sie nicht Ihre eigene assoziative Tabelle lokal, die die E-Mails mit eindeutigen Ganzzahlen bindet?

So ist der Arbeitsablauf würde in den Linien sein:

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. 

Macht das Sinn?

+0

Entschuldigung, aber nicht bekommen ... – jspeshu

+0

Die einzige Möglichkeit, wie Sie eine Verbindung zwischen Ihren E-Mails und einer Liste von Ganzzahlen erhalten können, ist eine persistente Schicht (eine Datenbank zum Beispiel), die als Mapper zwischen Ihren E-Mails und die Zahlen. So erstellen Sie Ihre Datenbanktabelle oder Datei lokal und speichern Sie die Daten wie folgt: [email protected] = 1001, [email protected] = 1002, etc .. – Slavic

+0

das ist was ich vermeiden will und was mich zu dieser Frage führen? aber danke, ich denke, dieser Kerl @nikic hat es – jspeshu

-1

können Sie diese Funktion verwenden:

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

ein bisschen hässlich, funktioniert aber :)

+1

Sie erstellen Vielleicht möchten Sie zuerst alle E-Mail-Adressen in Kleinbuchstaben umwandeln, so dass Sie immer einen konsistenten String-Wert erhalten (strtolower) – Hightower

+0

Die (int) -Cast ist nicht richtig, da sie immer den maximalen Wert für lange Zeichenketten zurückgibt – Rajesh

1

Dieser Code erzeugt 64-Bit-Zahl, die für die Verwendung als sie oder als BigInt/ähnliche Daten-Typ sein Datenbanken wie MySQL usw.

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 
Verwandte Themen