隐式类型转换与hash值比较
❗️❗️❗️HASH值比较请使用 ===,杜绝隐式类型转换。
<?php
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');
Output for 7.0.0 - 7.1.4
前5个被隐式转类型后比较数值相等;
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
// PHP7.0 含有十六进制数字的字符串不再被视为数字
// '0x1234Ab' -> int 0
// 0 == 1193131
bool(false)
// 字符串比较不相等
bool(false)
Output for 5.0.0 - 5.0.2, 5.2.1 - 5.6.30
全部被隐式转类型后比较数值相等;
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
<?php
function expr($hash, $a, $b) {
$ha = $hash($a);
$hb = $hash($b);
if ($ha == $hb) {
echo "$hash('$a') $ha <EQ> $hash('$b') $hb\n";
} else {
echo "$hash('$a') $ha <NOT EQ> $hash('$b') $hb\n";
}
}
expr("md5", '240610708', 'QNKCDZO');
expr("md5", 'aabg7XSs', 'aabC9RqS');
expr("sha1", 'aaroZmOk', 'aaK1STfY');
expr("sha1", 'aaO8zKZF', 'aa3OFF9m');
md5('240610708') 0e462097431906509019562988736854 <EQ> md5('QNKCDZO') 0e830400451993494058024219903391
md5('aabg7XSs') 0e087386482136013740957780965295 <EQ> md5('aabC9RqS') 0e041022518165728065344349536299
sha1('aaroZmOk') 0e66507019969427134894567494305185566735 <EQ> sha1('aaK1STfY') 0e76658526655756207688271159624026011393
sha1('aaO8zKZF') 0e89257456677279068558073954252716165668 <EQ> sha1('aa3OFF9m') 0e36977786278517984959260394024281014729