caw*_*caw 17 php string hash integer md5
在我的用户数据库表中,我将用户的电子邮件地址的MD5哈希值作为id.
例: email(example@example.org) = id(d41d8cd98f00b204e9800998ecf8427e)
不幸的是,我现在必须将id表示为整数值 - 以便能够使用其中id只能是整数的API.
现在我正在寻找一种方法将id编码为一个整数,以便在接收时再次发送解码.我怎么能这样做?
我的想法到目前为止:
convert_uuencode()
并convert_uudecode()
为MD5哈希ord()
值替换MD5哈希的每个字符哪种方法更好?你知道更好的方法吗?
我希望你能帮助我.非常感谢你提前!
bdo*_*lan 17
小心.将MD5转换为整数将需要支持大(128位)整数.有可能你正在使用的API只支持32位整数 - 或者更糟糕的是,可能正在处理浮点数.无论哪种方式,你的身份证都会受到影响.如果是这种情况,只需任意分配第二个ID就可以比处理MD5转换为整数更好.
但是,如果您确定 API可以毫无问题地处理任意大整数,则可以将MD5从十六进制转换为整数.PHP很可能不支持这种内置,因为它会尝试将其表示为32位整数或浮点数; 您可能需要使用PHP GMP库.
GZi*_*ipp 10
其他人表示有充分的理由以不同的方式做到这一点.
但是,如果您想要做的是将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);
}
Run Code Online (Sandbox Code Playgroud)
演示:
$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
Run Code Online (Sandbox Code Playgroud)
当然,您必须小心使用任一字符串,例如确保仅将它们用作字符串类型以避免丢失前导零,确保字符串是正确的长度等.
对于32位缩合,可以通过选择MD5散列的4个十六进制对(8个字符)来实现简单的解决方案,其中每对代表一个字节,然后用它转换intval()
.
对于无符号的32位Int:
$inthash = intval(substr(md5($str), 0, 8), 16);
Run Code Online (Sandbox Code Playgroud)
仅对有符号的32位Int的正值:
$inthash = intval(substr(md5($str), 0, 8), 16) >> 1;
Run Code Online (Sandbox Code Playgroud)
对于大多数现代系统,这可能仅适用于高达64位(8字节或16个字符)的值,如文档中所述.
在一个可以容纳64位Ints的系统上,一个使用整个128位MD5哈希作为2个Ints的拆分策略可能如下所示:
$hash = md5($str);
$inthash1 = intval(substr($hash, 0, 16), 16);
$inthash2 = intval(substr($hash, 16, 16), 16);
Run Code Online (Sandbox Code Playgroud)