Frage

In meiner Benutzerdatenbanktabelle, nehme ich den MD5-Hash der E-Mail-Adresse eines Benutzers als ID.

Beispiel: email(example@example.org) = id(d41d8cd98f00b204e9800998ecf8427e)

Leider habe ich jetzt die IDs als Integer-Werte darzustellen -. Um in der Lage sein, eine API zu verwenden, wo die ID nur eine ganze Zahl sein kann

Jetzt nach einem Weg, ich bin auf der Suche die ID in eine ganze Zahl für das Senden eines Dekodierungs es wieder beim Empfang zu kodieren. Wie könnte ich das tun?

Meine Ideen so weit:

  1. convert_uuencode() und convert_uudecode() für den MD5-Hash
  2. ersetzt jedes Zeichen des MD5-Hash von seinem ord() Wert

Welcher Ansatz ist besser? Wissen Sie noch bessere Möglichkeiten, dies zu tun?

Ich hoffe, dass Sie mir helfen können. Vielen Dank im Voraus!

War es hilfreich?

Lösung

Seien Sie vorsichtig. Umwandeln der MD5s zu einer ganzen Zahl wird die Unterstützung für große (128 Bit) Ganzzahlen erfordern. Die Chancen stehen die API Sie verwenden werden 32-Bit-Integer unterstützen nur - oder noch schlimmer, könnte mit der Zahl in Gleitkommaoperationen zu tun haben. So oder so, wird Ihre ID munged erhalten. Wenn dies der Fall ist, nur ein zweite ID willkürlich zuweisen ist ein viel besserer Weg, mit Dingen zu beschäftigen, als zu versuchen, die MD5 in eine Ganzzahl umgewandelt werden.

Wenn Sie jedoch sind sicher , dass der API mit beliebig großen ganzen Zahlen ohne Probleme umgehen kann, können Sie nur den MD5 von hexadezimal in einer ganzen Zahl konvertieren. PHP höchstwahrscheinlich nicht unterstützt dieses integrierte in jedoch, wie es versucht, es so darzustellen, als entweder ein 32-Bit-Integer oder Gleitkomma; Sie werden wahrscheinlich in der PHP GMP Bibliothek dafür verwenden müssen.

Andere Tipps

Es gibt gute Gründe, bereits von anderen erwähnt, denn es ist eine andere Art und Weise zu tun.

Aber wenn das, was Sie tun möchten, ist ein MD5-Hash in eine string umwandeln die Dezimalstellen (das ist, was ich denke, meinen Sie wirklich durch „Repräsentiert durch eine ganze Zahl“, da ein md5 ist bereits eine ganze Zahl in Form einer Zeichenfolge), und wandeln es wieder in die gleiche md5 string:

function md5_hex_to_dec($hex_str)
{
    $arr = str_split($hex_str, 4);
    foreach ($arr as $grp) {
        $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
    }
    return implode('', $dec);
}

function md5_dec_to_hex($dec_str)
{
    $arr = str_split($dec_str, 5);
    foreach ($arr as $grp) {
        $hex[] = str_pad(dechex($grp), 4, '0', STR_PAD_LEFT);
    }
    return implode('', $hex);
}

Demo:

$md5 = md5('example@example.com');
echo $md5 . '<br />';  // 23463b99b62a72f26ed677cc556c44e8
$dec = md5_hex_to_dec($md5);
echo $dec . '<br />';  // 0903015257466342942628374306682186817640
$hex = md5_dec_to_hex($dec);
echo $hex;             // 23463b99b62a72f26ed677cc556c44e8

Natürlich würde man vorsichtig sein muß entweder String, wie dafür, dass sie als String-Typ nur verwenden, führende Nullen nicht zu verlieren, um sicherzustellen, die Saiten sind die richtigen Längen, etc.

Für eine 32-Bit-Kondensation, könnte eine einfache Lösung, die durch Auswählen von 4 hex Paaren (8 Zeichen) durchgeführt wird des MD5-Hash, wobei jedes Paar ein Byte repräsentiert, und zum Umwandeln dann, dass mit intval() .

Für ein nicht signierten 32-Bit-Int:

$inthash = intval(substr(md5($str), 0, 8), 16);

Für den positiven Wert nur ein 32-Bit-Int:

$inthash = intval(substr(md5($str), 0, 8), 16) >> 1;

Dies wird wahrscheinlich nur für Werte arbeitet bis zu 64-Bit (8 Byte oder 16 Zeichen) für die meisten modernen Systeme wie in der Dokumentation angegeben ist.

Auf einem System, das 64-Bit-Ints aufnehmen kann, eine Aufspaltung Strategie, die der gesamte 128-Bit MD5-Hash als 2 Ints verbraucht könnte wie folgt aussehen:

$hash = md5($str);
$inthash1 = intval(substr($hash, 0, 16), 16);
$inthash2 = intval(substr($hash, 16, 16), 16);

Sie könnten verwenden hexdec den Hexadezimalwert und speichern zu analysieren die Nummer in der Datenbank.

Könnten Sie nicht fügen Sie einfach ein anderes Feld, das ein Auto-Inkrement int Feld war?

Warum ord ()? md5 produzieren normalen 16-Byte-Wert, präsentiert Ihnen in hex zur besseren Lesbarkeit. So können Sie nicht 16-Byte-Wert auf 4 oder 8 Byte-Integer ohne Verlust umwandeln. Sie müssen einen Teil Ihrer Algorithmen, ändern diese als ID verwendet werden.

was ist:

$ float = hexdec (md5 ( 'string'));

oder

$ int = (integer) (substr (hexdec (md5 ( 'string')), 0,9) * 100000000);

definietly größere Chancen für eine Kollision aber immer noch gut enaugh zu verwenden, anstatt von Hash in DB obwohl?

prost,

/ Marcin

Verwenden Sie die E-Mail-Adresse als Dateiname einer leeren, temporären Datei in einem freigegebenen Ordner, wie /var/myprocess/example@example.org

Dann rufen ftok auf den Dateinamen. ftok wird eine einzigartige, integer ID zurück.

Es wird aber nicht eindeutig sein wird garantiert, aber es wird wahrscheinlich für Ihre API ausreicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top