PHP 日本研討會 2024

hash_file

(PHP 5 >= 5.1.2,PHP 7,PHP 8,PECL hash >= 1.1)

hash_file使用給定檔案的內容產生雜湊值

描述

hash_file(
    string $algo,
    string $filename,
    bool $binary = false,
    array $options = []
): string|false

參數

algo

所選雜湊演算法的名稱(例如 "sha256")。如需支援演算法的清單,請參閱 hash_algos()

filename

描述要雜湊之檔案位置的 URL;支援 fopen() 包裝器。

binary

如果設定為 true,則輸出原始二進位資料。false 輸出小寫十六進位字元。

options

各種雜湊演算法的選項陣列。目前,MurmurHash 變體僅支援 "seed" 參數。

傳回值

傳回一個字串,其中包含計算出的訊息摘要,以小寫十六進位字元表示,除非 binary 設定為 true,在這種情況下,將傳回訊息摘要的原始二進位表示。

變更日誌

版本 描述
8.1.0 已新增 options 參數。

範例

範例 #1 使用 hash_file()

<?php
/* 建立要計算雜湊的檔案 */
file_put_contents('example.txt', 'The quick brown fox jumped over the lazy dog.');

echo
hash_file('sha256', 'example.txt');
?>

上述範例會輸出

68b1282b91de2c054c36629cb8dd447f12f096d3e3c587978dc2248444633483

另請參閱

新增註解

使用者貢獻的註解 8 則註解

10
apm at domain itsmee.co.uk
13 年前
我已經驗證 "crc32" 的輸出是 ITU I.363.5 演算法(又稱 AAL5 CRC - 由 BZIP2 推廣,但也用於 ATM 傳輸 - 該演算法與 POSIX 1003.2-1992 在 Cksum 中的演算法相同,但會在末尾將大小填入 CRC 中以進行額外測量)。但是,輸出以與許多 CRC 程式相反的順序表示。使用「標準」crctest.txt(數字 1 到 9 按順序 - Google 一下,不難找到),php 將輸出 181989fc - 許多其他(Intel 小端)程式會將此輸出為 fc891918,因此產生了混亂(至少我遇到了這種情況)。

crc32b 是 ITU V.42 的 32 位元訊框檢查序列(用於乙太網路,並由 PKZip 推廣)。此 CRC 的輸出以 Intel 小端格式推廣,並在同一個檔案上產生 cbf43926。
9
chernyshevsky at hotmail dot com
14 年前
如果您想使用 hash_file() 取得檔案的 CRC32 值,請使用以下程式碼將函式傳回的十六進位字串解包成整數(類似於 crc32())

$hash = hash_file('crc32b', $filepath);
$array = unpack('N', pack('H*', $hash));
$crc32 = $array[1];
10
synnus at gmail dot com
9 年前
bench 476 Mo,win 是 'haval160,4' : 0.037002

ALGO: md2,時間: 74.702272891998
ALGO: md4,時間: 9.2155270576477
ALGO: md5,時間: 9.0815191268921
ALGO: sha1,時間: 9.0945210456848
ALGO: sha224,時間: 9.1465229988098
ALGO: sha256,時間: 9.143522977829
ALGO: sha384,時間: 14.065804004669
ALGO: sha512,時間: 13.990800857544
ALGO: ripemd128,時間: 9.3185329437256
ALGO: ripemd160,時間: 9.3165328502655
ALGO: ripemd256,時間: 9.2495288848877
ALGO: ripemd320,時間: 9.2395279407501
ALGO: whirlpool,時間: 27.779588937759
ALGO: tiger128,3,時間: 9.3075330257416
ALGO: tiger160,3,時間: 9.1875250339508
ALGO: tiger192,3,時間: 9.3875370025635
ALGO: tiger128,4,時間: 9.1755249500275
ALGO: tiger160,4,時間: 9.355535030365
ALGO: tiger192,4,時間: 9.2025260925293
ALGO: snefru,時間: 42.781446218491
ALGO: snefru256,時間: 42.613437175751
ALGO: gost,時間: 18.606064081192
ALGO: gost-crypto,時間: 18.664067983627
ALGO: adler32,時間: 9.1535229682922
ALGO: crc32,時間: 10.126579999924
ALGO: crc32b,時間: 10.01757311821
ALGO: fnv132,時間: 9.7505569458008
ALGO: fnv1a32,時間: 9.7935597896576
ALGO: fnv164,時間: 9.8945660591125
ALGO: fnv1a64,時間: 9.3025319576263
ALGO: joaat,時間: 9.7175559997559
ALGO: haval128,3,時間: 9.6855540275574
ALGO: haval160,3,時間: 10.10857796669
ALGO: haval192,3,時間: 9.6765530109406
ALGO: haval224,3,時間: 20.636180877686
ALGO: haval256,3,時間: 10.641607999802
ALGO: haval128,4,時間: 7.5594329833984
ALGO: haval160,4,時間: 7.2884171009064
ALGO: haval192,4,時間: 7.2934169769287
ALGO: haval224,4,時間: 7.2964169979095
ALGO: haval256,4,時間: 7.3034179210663
ALGO: haval128,5,時間: 8.3244760036469
ALGO: haval160,5,時間: 8.3174757957458
ALGO: haval192,5,時間: 8.3204758167267
ALGO: haval224,5,時間: 8.3234758377075
ALGO: haval256,5,時間: 8.3254759311676

bench 13,0 Mo,win 是 'adler32' : 0.037002

ALGO: md2,時間: 2.0341160297394
ALGO: md4,時間: 0.062004089355469
ALGO: md5,時間: 0.071003913879395
ALGO: sha1,時間: 0.086004972457886
ALGO: sha224,時間: 0.18301010131836
ALGO: sha256,時間: 0.18301105499268
ALGO: sha384,時間: 0.36102104187012
ALGO: sha512,時間: 0.3610200881958
ALGO: ripemd128,時間: 0.15900897979736
ALGO: ripemd160,時間: 0.20701193809509
ALGO: ripemd256,時間: 0.16500997543335
ALGO: ripemd320,時間: 0.22501301765442
ALGO: whirlpool,時間: 0.74204206466675
ALGO: tiger128,3,時間: 0.12200689315796
ALGO: tiger160,3,時間: 0.12100696563721
ALGO: tiger192,3,時間: 0.12200713157654
ALGO: tiger128,4,時間: 0.15700888633728
ALGO: tiger160,4,時間: 0.15700888633728
ALGO: tiger192,4,時間: 0.15600895881653
ALGO: snefru,時間: 1.1520659923553
ALGO: snefru256,時間: 1.151065826416
ALGO: gost,時間: 0.48902797698975
ALGO: gost-crypto,時間: 0.49202799797058
ALGO: adler32,時間: 0.037002086639404
ALGO: crc32,時間: 0.10300588607788
ALGO: crc32b,時間: 0.093006134033203
ALGO: fnv132,時間: 0.043002128601074
ALGO: fnv1a32,時間: 0.045002937316895
ALGO: fnv164,時間: 0.12800693511963
ALGO: fnv1a64,時間: 0.12800693511963
ALGO: joaat,時間: 0.070003986358643
ALGO: haval128,3,時間: 0.12900686264038
ALGO: haval160,3,時間: 0.12800693511963
ALGO: haval192,3,時間: 0.12900805473328
ALGO: haval224,3,時間: 0.12800693511963
ALGO: haval256,3,時間: 0.12800693511963
ALGO: haval128,4,時間: 0.19901204109192
ALGO: haval160,4,時間: 0.1990110874176
ALGO: haval192,4,時間: 0.20001196861267
ALGO: haval224,4,時間: 0.20001101493835
ALGO: haval256,4,時間: 0.20001220703125
ALGO: haval128,5,時間: 0.22601294517517
ALGO: haval160,5,時間: 0.2270131111145
ALGO: haval192,5,時間: 0.2270131111145
ALGO: haval224,5,時間: 0.2270131111145
ALGO: haval256,5,時間: 0.22701287269592
1
lnker dot ua at gmail dot com
7 年前
連結 ID:6r1j-d2gs
程式碼描述:hash_file() 效能檢查;點擊表格標題欄即可排序;

使用 PhpFiddle 開啟程式碼 - http://phpfiddle.org/main/code/6r1j-d2gs
使用 PhpFiddle Lite 開啟程式碼 - http://phpfiddle.org/lite/code/6r1j-d2gs

所以不用太在意效能!只要使用您需要的即可!
3
Keisial at gmail dot com
16 年前
您看到的「位元組反轉」是已修正的錯誤 45028。http://bugs.php.net/bug.php?id=45028

在 mhash 的說明文件中解釋了 crc32 和 crc32b 之間的差異。crc32 是用於乙太網路的,而 crc32b 則是用於 zip、png 等。它們的不同之處在於所使用的表格不同。
3
holdoffhunger at gmail dot com
12 年前
Hash_File() 函數返回的值,與對同一塊資料執行 Hash() 函數所返回的值相同。起初,我不確定 Hash_File() 在定義給定演算法的雜湊資料時,是否使用了檔案名稱,甚至是否使用了權限設定。如果它那樣運作,那就意味著當你在系統上移動或重新命名相同檔案時,它們會有不同的 HASH 值。無論如何,幸運的是,它不是那樣運作的。Hash() 和 Hash_File() 對於同一塊資料產生相同的結果。Hash_HMAC() 和 Hash_HMAC_File() 函數之間的關係也是如此:相同的資料塊、相同的金鑰,產生相同的結果。這是一個明智的設計原則。

一些範例程式碼來示範這個原則

<?php

// 作者:holdoffhunger@gmail.com

// 預設資料
// ------------------------------------------------

$test_data = "php-hashing";
$test_file = "test.txt";
$test_file_read = file_get_contents($test_file);

// 雜湊資料
// ------------------------------------------------

$test_data_hash = hash("md2", $test_data, FALSE);
$test_file_hash = hash_file("md2", $test_file, FALSE);

// 列印雜湊結果
// ------------------------------------------------

print("資料雜湊 ($test_data): $test_data_hash<br><br>");
print(
"檔案雜湊 ($test_file_read): $test_file_hash");

?>

預期結果
..................................

資料雜湊 (php-hashing): 457d84e1d69e519a7b73348db21477d3

檔案雜湊 (php-hashing): 457d84e1d69e519a7b73348db21477d3
2
Lawrence Cherone
6 年前
有時需要使用不同的演算法來雜湊同一個檔案,

<?php
function hash_file_multi($algos = [], $filename) {
if (!
is_array($algos)) {
throw new
\InvalidArgumentException('第一個參數必須是一個陣列');
}

if (!
is_string($filename)) {
throw new
\InvalidArgumentException('第二個參數必須是一個字串');
}

if (!
file_exists($filename)) {
throw new
\InvalidArgumentException('第二個參數,找不到檔案');
}

$result = [];
$fp = fopen($filename, "r");
if (
$fp) {
// 初始化雜湊上下文
foreach ($algos as $algo) {
$ctx[$algo] = hash_init($algo);
}

// 計算雜湊
while (!feof($fp)) {
$buffer = fgets($fp, 65536);
foreach (
$ctx as $key => $context) {
hash_update($ctx[$key], $buffer);
}
}

// 完成雜湊並儲存於回傳值中
foreach ($algos as $algo) {
$result[$algo] = hash_final($ctx[$algo]);
}

fclose($fp);
} else {
throw new
\InvalidArgumentException('無法開啟檔案以進行讀取');
}
return
$result;
}
?>

使用方式如下

<?php
$result
= hash_file_multi(['md5', 'sha1', 'sha256'], 'path/to/file.ext');

var_dump($result['md5'] === hash_file('md5', 'path/to/file.ext')); //true
var_dump($result['sha1'] === hash_file('sha1', 'path/to/file.ext')); //true
var_dump($result['sha256'] === hash_file('sha256', 'path/to/file.ext')); //true
-2
Anonymous
13 年前
請注意,hash-file 在處理 >=2GB 的檔案時會拋出錯誤。
To Top