Question

Dans ma table de base de données d'utilisateurs, je prends le hachage MD5 de l'adresse électronique d'un utilisateur comme identifiant.

Exemple: email (exemple@exemple.org) = id (d41d8cd98f00b204e9800998ecf8427e)

Malheureusement, je dois maintenant représenter les identifiants sous forme de valeurs entières - afin de pouvoir utiliser une API où l'identifiant ne peut être qu'un entier.

Maintenant, je cherche un moyen de coder l'identifiant en un entier pour envoyer à nouveau un décodage lors de la réception. Comment pourrais-je faire cela?

Mes idées jusqu'à présent:

  1. convert_uuencode () et convert_uudecode () pour le hachage MD5
  2. remplace chaque caractère du hachage MD5 par sa ord () valeur

Quelle approche est la meilleure? Savez-vous même de meilleures façons de le faire?

J'espère que vous pourrez m'aider. Merci beaucoup d'avance!

Était-ce utile?

La solution

Soyez prudent. La conversion des MD5 en un entier nécessitera la prise en charge de grands entiers (128 bits). Il est fort probable que l'API que vous utilisez ne supporte que les entiers 32 bits - ou pire, peut traiter du nombre en virgule flottante. De toute façon, votre identité sera munie. Si tel est le cas, il est bien préférable d’affecter un second ID de manière arbitraire que de tenter de convertir le MD5 en entier.

Toutefois, si vous êtes sûr que l'API peut traiter sans problème des entiers arbitrairement grands, vous pouvez simplement convertir le MD5 de hexadécimal en entier. PHP ne supporte probablement pas cette fonctionnalité intégrée, car il essaiera de la représenter sous la forme d'un entier 32 bits ou d'un nombre à virgule flottante; vous devrez probablement utiliser la bibliothèque PHP GMP pour cela.

Autres conseils

Il y a de bonnes raisons, citées par d'autres, de le faire différemment.

Mais si vous voulez convertir un hachage md5 en chaîne chiffres décimaux (c’est ce que je pense que vous entendez vraiment par "représente un entier", puisqu'un md5 est déjà un entier sous forme de chaîne), et le transformer en la même chaîne md5:

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);
}

Démo:

$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

Bien sûr, vous devrez faire preuve de prudence en utilisant l'une des chaînes, comme en vous assurant de ne les utiliser que comme type de chaîne pour éviter de perdre des zéros, en vous assurant que les chaînes ont la bonne longueur, etc.

.

Pour une condensation 32 bits, une solution simple pourrait être apportée en sélectionnant 4 paires hexadécimales (8 caractères) du hachage MD5, chaque paire représentant un octet, puis en les convertissant avec intval () .

Pour un int 32 bits non signé:

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

Pour la valeur positive uniquement d'un entier 32 bits signé:

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

Cela ne fonctionnera probablement que pour des valeurs allant jusqu'à 64 bits (8 octets ou 16 caractères) pour la plupart des systèmes modernes, comme indiqué dans la documentation.

Sur un système pouvant prendre en charge les Ints 64 bits, une stratégie de fractionnement utilisant tout le hachage MD5 128 bits en tant que 2 Ints pourrait ressembler à ceci:

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

Vous pouvez utiliser hexdec pour analyser la chaîne hexadécimale et la stocker. le numéro dans la base de données.

Ne pourriez-vous pas simplement ajouter un autre champ qui était un champ int auto-incrémenté?

Pourquoi ord ()? md5 produit une valeur normale de 16 octets, qui vous est présentée au format hexadécimal pour une meilleure lisibilité. Donc, vous ne pouvez pas convertir une valeur de 16 octets en entier de 4 ou 8 octets sans perte. Vous devez modifier une partie de vos algorithmes pour l'utiliser comme identifiant.

qu'en est-il:

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

ou

$ int = (entier) (substr (hexdec (md5 ('chaîne'))), 0,9) * 100000000);

Cependant, les chances de collision sont nettement plus grandes, mais vous pouvez toujours utiliser un bon traitement à la place du hash dans la base de données?

acclamations,

/ Marcin

Utilisez l'adresse e-mail comme nom de fichier d'un fichier temporaire vide contenu dans un dossier partagé, tel que /var/monprocessus/exemple@exemple.org

Ensuite, appelez ftok sur le nom du fichier. ftok retournera un identifiant unique unique.

Cela ne sera pas garanti d'être unique, mais cela suffira probablement pour votre API.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top