请注意,即使使用同一图像,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() 函数将接受三个参数(一个用于要使用的算法,一个用于文件名,还有一个用于二进制输出的可选变量)。您可以使用 SHA-256、SHA-384、SHA-512、Whirlpool、HAVAL、Salsa、Gost、Adler32、CRC32 或 MD5 等算法,以及这些算法的变体,而不受限于 getImageSignature 函数的 SHA-1 算法。
但是,对文件执行的 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 个算法)...