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

各种哈希算法的选项数组。目前,只有 "seed" 参数受 MurmurHash 变体支持。

返回值

返回一个字符串,其中包含计算的消息摘要,以小写十六进制表示,除非 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

参见

  • hash_init() - 初始化增量哈希上下文
  • hash_hmac_file() - 使用 HMAC 方法和给定文件的內容生成带密钥的哈希值

添加注释

用户贡献注释 9 个注释

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 - 在谷歌搜索,很容易找到),php 将输出 181989fc - 许多其他(Intel 小端)程序会将其输出为 fc891918,因此造成了混淆(至少我遇到了)。

crc32b 是 ITU V.42 的 32 位帧校验序列(用于以太网,并由 PKZip 推广)。来自此 CRC 的输出在 Intel 小端格式中很流行,并且在同一文件上会产生 cbf43926。
9
chernyshevsky at hotmail dot com
13 年前
如果你想使用 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 年前
基准测试 476 Mo,获胜者是 '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

基准测试 13,0 Mo,获胜者是 '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
6 年前
链接 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
15 年前
你看到的“字节序反转”是 bug 45028,该 bug 已经修复。 http://bugs.php.net/bug.php?id=45028

crc32 和 crc32b 之间的区别在 mhash 手册页中解释。crc32 是以太网中使用的校验和,而 crc32b 是 zip、png 等中使用的校验和。它们使用不同的校验表。
3
holdoffhunger at gmail dot com
12 年前
Hash_File() 函数返回的值与对相同数据执行 Hash() 函数时的值相同。起初,我不确定 Hash_File() 函数在为给定算法定义要哈希的数据时,是否使用了文件名,甚至使用了权限设置。如果它确实那样工作,那么这意味着当你移动或重命名系统上的相同文件时,它们将具有不同的哈希值。无论如何,幸运的是,它不是那样工作的。Hash() 和 Hash_File() 函数对相同数据生成相同的结果。这对于 Hash_HMAC() 和 Hash_HMAC_File() 函数之间的关系也是如此:相同的数据,相同的密钥,生成相同的结果。这是一个明智的设计原则。

一些示例代码来演示这个原则

<?php

// 作者:[email protected]

// 预设数据
// ------------------------------------------------

$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
-1
Anonymous
13 年前
请注意,hash-file 函数在处理大于等于 2GB 的文件时会抛出错误。
-18
allaryin at gmail dot com
16 年前
对于那些想知道的人来说,hash_file('md5')/hash_file('sha1') 和 md5_file()/sha1_file() 之间似乎没有根本区别。它们生成相同的输出,并且性能相当。

但是,hash_file('crc32') 与 crc32(file_get_contents()) 之间存在差异。

crc32(file_get_contents()) 的结果与 hash_file('crc32b') 的结果最相似,只是字节序相反。

<?php
$fname
= "something.png";

$hash = hash_file( 'crc32', $fname );
echo
"crc32 = $hash\n";

$hash = hash_file( 'crc32b', $fname );
echo
"crc32b = $hash\n";

$hash = sprintf("%x",crc32(file_get_contents($fname)));
echo
"manual = $hash\n";
?>

crc32 = f41d7f4e
crc32b = 7dafbba4
manual = a4bbaf7d
To Top