Imagick::getImageSignature

(PECL imagick 2, PECL imagick 3)

Imagick::getImageSignature生成 SHA-256 消息摘要

描述

public Imagick::getImageSignature(): string

为图像像素流生成 SHA-256 消息摘要。

参数

此函数没有参数。

返回值

返回一个包含文件 SHA-256 哈希的字符串。

错误/异常

在错误时抛出 ImagickException。

添加备注

用户贡献的备注 4 则备注

barrerasalom at gmail dot com
10 年前
请注意,即使使用同一图像,ImageMagick 的不同版本也可能会生成不同的签名。
vojtech at kral dot hk
11 年前
嗯,此函数返回的 SHA-2 摘要与您对文件进行哈希运算时得到的摘要不同,因为此函数对像素本身进行哈希运算。

当您需要识别相同的图像时,这非常有用,因为如果您只对文件进行哈希运算,即使图像在像素级别上相同,您也可能获得不同的哈希值,因为元数据存在差异或格式不同(例如 PNG 与 BMP),或者可能是在文件末尾出现无关字节等...

发布对文件进行哈希运算的代码没有意义,这与这里完全无关。

此外,我怀疑您是否真的需要选择不同的哈希算法,SHA-2 对于这项工作应该完全没问题。
holdoffhunger at gmail dot com
12 年前
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
holdoffhunger at gmail dot com
12 年前
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 个算法)...
To Top