请注意,即使使用相同的图像,不同版本的 ImageMagick 也可能创建不同的签名。
(PECL imagick 2, PECL imagick 3)
Imagick::getImageSignature — 生成 SHA-256 消息摘要
此函数没有参数。
返回包含文件 SHA-256 哈希值的字符串。
错误时抛出 ImagickException。
此函数返回的 SHA-2 摘要与您对文件进行哈希处理时获得的结果不同,因为此函数对像素本身进行哈希处理。
当您需要识别相同的图像时,这非常有用,因为如果您只是对文件进行哈希处理,即使图像在像素级别相同,您也可能会获得不同的哈希值,这是因为元数据差异或不同的格式(例如 PNG 与 BMP)或文件末尾的杂散字节等…
发布对文件进行哈希处理的代码毫无意义,这里完全不相关。
此外,我怀疑您真的需要选择不同的哈希算法,SHA-2 对这项工作来说应该足够好。
getImageSignature 函数返回 SHA-256 哈希值,其长度为 256 位(或 32 字节)。SHA-256 是由 NSA 设计的 SHA-2 加密哈希函数集的一部分,其中还包括 SHA-224、SHA-384 和 SHA-512。根据维基百科,它存在一些与 SHA-1 哈希函数集类似的安全漏洞,最终应该通过 SHA-3 来修复。与 MD5 或 SHA-1 加密函数集不同,SHA-2 尚未发现任何冲突(冲突是指两个不同的数据片段导致哈希函数产生相同哈希值的情况)。目前,它似乎是为文件或数据片段创建小型(32 字节)、唯一可识别、通常安全的值得最有效的方法。
一些示例代码
<?php
// 作者:[email protected]
// Imagick 类型
// ---------------------------------------------
$imagick_type = new Imagick();
// 打开文件
// ---------------------------------------------
$file_to_grab = "image_workshop_directory/test.bmp";
$file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');
// 获取文件
// ---------------------------------------------
$imagick_type->readImageFile($file_handle_for_viewing_image_file);
// 获取图像 SHA-256 签名/哈希值
// ---------------------------------------------
$imagick_type_signature = $imagick_type->getImageSignature();
// 打印图像签名/哈希值
// ---------------------------------------------
print($imagick_type_signature);
?>
对标准 BMP 图像执行此操作的结果
cb2f387a7b23d11340ad1f5ba9c765125ea6b2d50a0d25412abe1ce568adac68
PHP 中 ImageMagick 包的 getImageSignature 函数仅返回图像的 SHA-1 哈希值。ImageMagick 包中没有其他可用的算法,但幸运的是,这是 PHP,您可以使用各种哈希算法处理任何图像文件。函数 hash_algos() 将返回 PHP 中可用的哈希算法数组,函数 hash_file() 将采用三个参数(一个用于要使用的算法,一个用于文件名,以及一个可选的二进制输出变量)。您无需局限于 getImageSignature 函数的 SHA-1 算法,您可以使用 SHA-256、SHA-384、SHA-512、Whirlpool、HAVAL、Salsa、Gost、Adler32、CRC32 或 MD5 等以及这些算法的变体。
但是,对文件执行的 hash_file() 函数的 SHA-1 结果与 getImageSignature() 函数的 SHA-1 结果不同。这让我相信 getImageSignature() 的 SHA-1 可能是对 Imagick 对象本身执行的,而不是对文件执行的,而 hash_file() 函数显然是对文件本身执行的。但这只是猜测。
另一种哈希算法的示例代码,对图像文件执行每种算法
<?php
// 作者:[email protected]
// 设置用于哈希函数的文件
// ---------------------------------------------------
$filename_with_folder_for_hashing = "image_workshop/test_file.bmp";
// 获取动态哈希算法列表
// ---------------------------------------------------
$php_dynamic_hash_algorithms = hash_algos();
// 统计动态哈希算法列表数量
// ---------------------------------------------------
$number_of_dynamic_hash_algorithms = count($php_dynamic_hash_algorithms);
// 解析动态哈希算法列表
// ---------------------------------------------------
for($i = 0; $i < $number_of_dynamic_hash_algorithms; $i++)
{
// 获取当前哈希算法
// ---------------------------------------------------
$current_hashing_algorithm = $php_dynamic_hash_algorithms[$i];
// 对文件执行哈希运算
// ---------------------------------------------------
$current_hashing_algorithm_hex_result = hash_file($current_hashing_algorithm, $filename_with_folder_for_hashing, FALSE);
// 打印哈希结果
// ---------------------------------------------------
print("$current_hashing_algorithm 算法 ::: $current_hashing_algorithm_hex_result");
print("<br><br>");
}
?>
示例结果
...........................
md2 算法 ::: 03205df9c6717d74f1f003c66f58e98a
md4 算法 ::: b2a204a2e5c3968d2abd5dc372fbee10
md5 算法 ::: b9d92a61714b221d24c7730d4764ca82
sha1 算法 ::: 8db4c92346c26568b13ea43fbcf514e37942a41a
(还有 34 个算法...)