php[world] in Washington, D.C.

hash_file

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

hash_fileBerechnet den Hash des Inhalts einer Datei

Beschreibung

string hash_file ( string $algo , string $filename [, bool $raw_output = false ] )

Parameter-Liste

algo

Name des gewählten Hash-Algorithmus (z.B. "md5", "sha256", "haval160,4", usw...)

filename

URL der Datei, die gehasht werden soll, fopen-Wrapper werden unterstützt.

raw_output

Ist dieser Parameter TRUE, werden direkt Binärdaten zurückgegeben, andernfalls werden klein geschriebene Hexadezimalziffern zurückgegeben.

Rückgabewerte

Gibt den berechneten Hash als Hexadezimalzahl zurück, außer raw_output ist wahr, in diesem Fall wird die binäre Darstellung des Hashes zurückgegeben.

Beispiele

Beispiel #1 hash_file()-Beispiel

<?php
/* Erstelle die Datei, deren Inhalt gehasht werden soll */
file_put_contents('example.txt''Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.');

echo 
hash_file('md5''example.txt');
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

ba4b9da310763a91f8edc7c185a1e4bf

Siehe auch

  • hash() - Berechnet den Hash einer Nachricht
  • hash_hmac_file() - Berechnet einen Hash einer Datei mit Schlüssel unter Verwendung von HMAC
  • hash_update_file() - Fügt Daten aus einer Datei an einen aktiven Hash-Kontext an
  • md5_file() - Berechnet den MD5-Code einer Datei
  • sha1_file() - Berechnet den SHA1-Hash einer Datei

add a note add a note

User Contributed Notes 6 notes

up
5
Anonymous
3 years ago
Please take note that hash-file will throw error on files >=2GB.
up
4
chernyshevsky at hotmail dot com
3 years ago
If you want to use hash_file() to get the CRC32 value of a file, use the following to unpack the hex string returned by the function to an integer (similar to crc32()):

$hash = hash_file('crc32b', $filepath);
$array = unpack('N', pack('H*', $hash));
$crc32 = $array[1];
up
1
holdoffhunger at gmail dot com
2 years ago
The Hash_File() function returns the same value as if the function Hash() had been performed on the same exact piece of data.  At first, I was uncertain if Hash_File() used the filename, or even the permission settings, when defining the data to be hashed for the given algorithm.  If it did work that way, then that means the same exact files would have different HASH values when you moved or renamed them on your system.  Anyway, fortunately, it does not work that way.  Hash() and Hash_File() produce identical results for the same pieces of data.  This is also true for the relationship between the Hash_HMAC() and Hash_HMAC_File() functions: the same pieces of data, the same keys, produce identical results.  It was a wise, design principle.

Some sample code to demonstrate this principle :

<?php

           
// Author: holdoffhunger@gmail.com

        // Preset Data
        // ------------------------------------------------
       
   
$test_data = "php-hashing";
   
$test_file = "test.txt";
   
$test_file_read = file_get_contents($test_file);
   
       
// Hash Data
        // ------------------------------------------------
   
   
$test_data_hash = hash("md2", $test_data, FALSE);
   
$test_file_hash = hash_file("md2", $test_file, FALSE);
   
       
// Print Hash Results
        // ------------------------------------------------
   
   
print("Data Hash ($test_data): $test_data_hash<br><br>");
    print(
"File Hash ($test_file_read): $test_file_hash");
   
?>

    Expected Results
    ..................................
   
Data Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3

File Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3
up
1
Keisial at gmail dot com
5 years ago
The 'octets reversed' you are seeing is the bug 45028 which has been fixed. http://bugs.php.net/bug.php?id=45028

The difference between crc32 and crc32b is explained on mhash man page. crc32 is the one used on ethernet, while crc32b is the one used on zip, png... They differ on the table used.
up
0
apm at domain itsmee.co.uk
3 years ago
I have verified that the output of the "crc32" is the ITU I.363.5 algorithm (a.k.a. AAL5 CRC - popularised by BZIP2 but also used in ATM transmissions - the algorithm is the same as that in POSIX 1003.2-1992 in Cksum but that stuffs the size into the CRC at the end for extra measure).  However, the output is expressed in reverse order to many CRC programs.  Using the "standard" crctest.txt (numbers 1 to 9 in sequence - google it, it's not hard to find), php will output 181989fc - many other (Intel little endian) programs would output this as fc891918, hence the confusion (that I have had, at least).

The crc32b is the 32-bit Frame Check Sequence of ITU V.42 (used in Ethernet and popularised by PKZip).  The output from this CRC is popularised in Intel little endian format and would produce cbf43926 on the same file.
up
0
allaryin at gmail dot com
6 years ago
For those who are wondering, there appears to be no fundamental difference between hash_file('md5')/hash_file('sha1') and md5_file()/sha1_file(). They produce identical output and have comparable performance.

There is, however, a difference between hash_file('crc32') and something silly like crc32(file_get_contents()).

crc32(file_get_contents())'s results are most similar to those of hash_file('crc32b'), just with the octets reversed:

<?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