請注意,即使使用相同的影像,不同版本的 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
// 作者:holdoffhunger@gmail.com
// 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
// 作者:holdoffhunger@gmail.com
// 設定雜湊函數的檔案
// ---------------------------------------------------
$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 種演算法)...