Regina Schaukrug: Gibt es einen Unterschied? md5_file vs. hash_file('md5')

Beitrag lesen

  • 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.