- hash_file() gibt es seit PHP 5.1.2
- md5_file() gibt es seit PHP 4.2.0
Ich würde jetzt vermuten, dass md5_file( $file, false )
lediglich ein Aufruf von hash_file('md5', $file, false)
ist und letztendlich dann hash('md5', file_get_contents( $file), false )
aufgerufen wird.
Tipp:
hash_file()
ist flexibler:
in einem Skript könnte das so aussehen: ( Die Datei $file
wird nur neu geschrieben, wenn sich $_POST['text'] von bisherigen Inhalt unterscheidet )
define ('HashMethod', setHashMethod() );
if (
( ! is_file( $file ) )
or hash_file( HashMethod, $file ) != hash( HashMethod, $_POST['text']
) {
file_put_contents( $file, $_POST['text'], LOCK_EX );
}
function setHashMethod ()
$prefered_hash_methods = array( 'sha256', 'md5' );
foreach ( $prefered_hash_methods as $method ) {
if ( in_array $method ) {
return $method;
}
}
trigger_error ( 'Fatal: Keine der Hashmethoden (Vorgabe: ' . implode(', ', $prefered_hash_methods) . ' ) wählbar!', E_USER_ERROR);
Ergänzung zu dedlfix:
Möglicherweise gibt irgendein extern durchgeführtes Hash-Programm für den gleichen Inhalt nicht etwas wie
'2a0973908ffa44eb4a01ad5729298cdd'
also die hexadezimale Repräsentierung des eigentlich binären Hashes zurück, sondern etwas wie
'CYkezTbdXcqKGFinQxI0ww=='
(die Base-64-codierte Repräsentierung). Dann ist
$hash = base64encode( hash( $method, $blob, true ) );
bzw.
$hash = base64encode( hash_file( $method, $file, true ) );
für den Vergleich verwendbar.
Ein binärer Hash sieht in einer Konsole etwa so aus: ?h��뻳u�a��iK=�
Ein solcher kann das Terminal aber "zerstören" (nicht immer mit reset
behebbar); ebenso kann es dazu kommen, dass andere, nicht binär-sichere Programme "in nicht beabsichtigter Weise" reagieren weshalb regelmäßig die Darstellung und Ausgabe als hexadezimale Repräsentierung bzw. Base-64-kodierter Blob verwendet werden.