我在使用php 5.4的php代码,我试图用tiger192,3散列字符串,毕竟我没有得到正确的哈希。
$keyLength = 24;
$keyCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$string = '';
$key = '';
$keyHash = '';
$first8Hash = '';
$uniqueKey = false;
while ($uniqueKey == false)
{
for ($p = 0; $p < $keyLength; $p++)
{
$string .= $keyCharacters[mt_rand(0, strlen($keyCharacters)-1)];
}
$key = $string;
$keyHash = hash('tiger192,3', $key);
$first8Hash = substr($keyHash, 0, 16);
$sql = "SELECT * FROM `penkeys` WHERE first8 = '" . $first8Hash . "'";
$result = $db->sql_query($sql);
while ($keyrow = $db->sql_fetchrow($result))
{
$uniqueKey = false;
}
$db->sql_freeresult($result);
$uniqueKey = true;
}我正在散列字符串nQ5GcLMsOlPIaUYJOMkmjo7f,我应该得到babcb7d489332aee9c554a7a654bb65b4dd892e5b80e0156,但我得到的是ee2a3389d4b7bcba5bb64b657a4a559c56010eb8e592d84d。你能帮帮我吗?
发布于 2016-01-27 18:16:06
这是一个有趣的案例,两个答案( php答案和时间戳生成器答案)都是正确的。在PHP >= 5.4中,老虎哈希使用大端字节表示法,而在PHP < 5.4中,它可能使用小对字节表示法(在http://php.net/manual/en/function.hash.php中有说明)。下面的函数位于php中,oldtiger给出了babcb7d489332aee9c554a7a654bb65b4dd892e5b80e0156作为结果。
function old_tiger($data = "", $width=192, $rounds = 3) {
return substr(
implode(
array_map(
function ($h) {
return str_pad(bin2hex(strrev($h)), 16, "0");
},
str_split(hash("tiger192,$rounds", $data, true), 8)
)
),
0, 48-(192-$width)/4
);
}
echo hash('tiger192,3', 'a-string'), PHP_EOL;
echo old_tiger('a-string'), PHP_EOL;如果你注意到,babcb7d489332aee9c554a7a654bb65b4dd892e5b80e0156和ee2a3389d4b7bcba5bb64b657a4a559c56010eb8e592d84d都是彼此的暗喻,这不仅仅是巧合。两个字符串之间的endianness发生了变化。每组8个字节的顺序是相反的.
ee-2a-33-89-d4-b7-bc-ba变成ba-bc-b7-d4-89-33-2a-ee.每个64位(8字节)字的字节顺序被切换.
https://stackoverflow.com/questions/35044184
复制相似问题