两个密码软件包,MHash 和 HASH Message Digest Framework,都具有相同的算法,然而,它们有时在对同一数据应用相同的算法时会产生截然不同的结果。 SHA-x 算法(由国家安全局设计)似乎都具有产生其哈希值的具体标准,因此它们的结果相似。 即使是两个 MD5 实现也会产生相同的结果,对于 Gost、RipeMD、CRC32、Whirlpool、Snefru256(在 MHash 中称为 'Snefru256',在 HASH-MDF 中简称为 'Snefru')和 Tiger(HASH-MDF 中的三轮版本简称为 MHash 中的 'Tigerx')也是如此。
但是,CRC32B 和 Adler32 算法在从 MHash 或 HASH-MDF 调用时会产生不同的结果,这可能是因为它们是旨在用作校验和的散列算法,而不是可以生成字符串作为特定信息片段的唯一标识符的东西。 因此,如果你在公开发布的数据中发布哈希结果,最好说明它是 MHash 还是 HASH-MDF 算法的实现。 否则,哈希值将无法作为特定数据片段或文件的唯一标识符提供太多用处。
一些更好的解释我的意思的示例代码
<?php
$mhash_sha1_results = bin2hex(mhash(MHASH_SHA1, "secret"));
$hash_mdf_sha1_results = hash("sha1", "secret", FALSE);
print("MHash SHA-1: $mhash_sha1_results .<br>");
print("HASH-MDF SHA-1: $hash_mdf_sha1_results .<br><br>");
$mhash_whirlpool_results = bin2hex(mhash(MHASH_WHIRLPOOL, "secret"));
$hash_mdf_whirlpool_results = hash("whirlpool", "secret", FALSE);
print("MHash Whirlpool: $mhash_whirlpool_results .<br>");
print("HASH-MDF Whirlpool: $hash_mdf_whirlpool_results .<br><br>");
$mhash_crc32b_results = bin2hex(mhash(MHASH_CRC32B, "secret"));
$hash_mdf_crc32b_results = hash("crc32b", "secret", FALSE);
print("MHash CRC32B: $mhash_crc32b_results .<br>");
print("HASH-MDF CRC32B: $hash_mdf_crc32b_results .<br><br>");
$mhash_adler32_results = bin2hex(mhash(MHASH_ADLER32, "secret"));
$hash_mdf_adler32_results = hash("adler32", "secret", FALSE);
print("MHash Adler32: $mhash_adler32_results .<br>");
print("HASH-MDF Adler32: $hash_mdf_adler32_results .<br><br>");
?>
预期结果
........................
MHash SHA-1: e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 .
HASH-MDF SHA-1: e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 .
MHash Whirlpool: e061b87a674ae3880e159ab55ed35d
6c5e8a6aefac6ab08304a50588018d
377b28639bb15fdeedf006d57e45f7
b4298e6dfefceaf7c92c826a708fe6d
1156eb3 .
HASH-MDF Whirlpool: e061b87a674ae3880e159ab55ed35d
6c5e8a6aefac6ab08304a50588018d
377b28639bb15fdeedf006d57e45f7
b4298e6dfefceaf7c92c826a708fe6d
1156eb3 .
MHash CRC32B: e5e8a25c .
HASH-MDF CRC32B: 5ca2e8e5 .
MHash Adler32: 8702d108 .
HASH-MDF Adler32: 08d10287 .