将 MD5 哈希表示为整数

2022-08-30 20:49:32

在我的用户数据库表中,我将用户电子邮件地址的 MD5 哈希值作为 id。

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

不幸的是,我现在必须将id表示为整数值 - 以便能够使用ID只能是整数的API。

现在我正在寻找一种将id编码为整数的方法,以便在接收时再次发送解码。我该怎么做?

到目前为止,我的想法:

  1. convert_uuencode()和 MD5 哈希convert_uudecode()
  2. 将 MD5 哈希的每个字符替换为其值ord()

哪种方法更好?您知道更好的方法来做到这一点吗?

我希望你能帮助我。非常感谢你提前!


答案 1

小心。将 MD5 转换为整数将需要支持大(128 位)整数。您使用的 API 可能仅支持 32 位整数 , 或者更糟的是,可能正在处理浮点数。无论哪种方式,您的ID都会被篡改。如果是这种情况,那么与尝试将MD5转换为整数相比,任意分配第二个ID是处理事情的更好方法。

但是,如果您确定 API 可以毫无困难地处理任意大的整数,则只需将 MD5 从十六进制转换为整数即可。然而,PHP很可能不支持这种内置功能,因为它会尝试将其表示为32位整数或浮点数;您可能需要使用PHP GMP库


答案 2

其他人说,有充分的理由以不同的方式做到这一点。

但是,如果您要做的是将md5哈希转换为十进制数字字符串(我认为您真正指的是“用整数表示”,因为md5已经是字符串形式的整数),并将其转换回相同的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);
}

演示:

$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

当然,使用任一字符串都必须小心,例如确保仅将它们用作字符串类型以避免丢失前导零,确保字符串的长度正确等。


推荐