(PHP 4 >= 4.3.0, PHP 5)
sha1_file — Berechnet den SHA1-Hash einer Datei
Berechnet den SHA1-Hash von filename unter Verwendung des » US Secure Hash Algorithmus 1 und gibt den Hashwert zurück. Der Hash ist ein 40 Zeichen langer Hexadezimalwert.
Der Dateiname
Falls TRUE, wird der SHA1-Extrakt im Raw-Binary-Format mit einer Länge von 20 Zeichen zurückgegeben.
Gibt bei Erfolg einen String zurück, ansonsten FALSE.
Beispiel #1 sha1_file()-Beispiel
<?php
foreach(glob('/home/kalle/meinprojekt/*.php') as $ent)
{
if(is_dir($ent))
{
continue;
}
echo $ent . ' (SHA1: ' . sha1_file($ent) . ')', PHP_EOL;
}
?>
Version | Beschreibung |
---|---|
5.0.0 | Einführung des raw_output Parameters |
5.1.0 | Die Funktion verwendet jetzt die Streams API. Das bedeutet, dass Sie die Funktion mit Wrappern wie sha1_file('http://example.com/..') nutzen können. |
In php 5.1.2 and above, the alternative to using this could be this little bit I wrote. It can be used for other hashes as well.
<?php
/* $by : Nicholas
$date : 11/25/08
$site : http://nrgsrpg.com
$copyright: This can be redistributed at will.
*/// $des : For Hashing Files in all sorts of ways
class hashing {
public static function filehash($file,$hash) {
if (file_exists($file)) {
return hash($hash,file_get_contents($file));
}
else {
return "Error Occurred: File Does Not Exist";
}
}
}
echo hashing::filehash("index.php","sha1")."<br />";
echo hashing::filehash("index.php","whirlpool")."<br />";
echo hashing::filehash("index.php","sha512");
?>
Have fun!
<?php
if(!function_exists('sha1_file'))
{
function sha1_file($file = null)
{
if(is_null($file) || !file_exists($file))
{
return trigger_error('File is null or does not exists');
}
return sha1(file_get_contents($file));
}
}
?>
Remember, it's important to write a corret url like this:
/home/snackzon/public_html/php/sha1.php
If you've got a script that allows user file upload, and you want to prevent multiple uploads of the same file:
<?
session_start();
$isDuplicate = false;
if(isset($_FILES["filename"]["tmp_name"]) && file_exists($_FILES["filename"]["tmp_name"])) {
$fileHash = sha1_file($_FILES["filename"]["tmp_name"]);
if(!isset($_SESSION["check_filelist"])) {
$_SESSION["check_filelist"] = array($fileHash);
}
elseif(in_array($fileHash,$_SESSION["check_filelist"])) {
$isDuplicate = true;
}
else {
$_SESSION["check_filelist"][] = $fileHash;
}
if($isDuplicate) {
echo "You've already uploaded that file";
}
else{
// do some stuff
}
}
?>
checking the sha1 of the file. ideal for download scripts making sure the file the user is downloading is not currupt
by checking the sha1 key
<?php
$filename = './Path/To/Your/File.zip';
if (file_exists($filename)) {
echo"i see the file";
} else {
echo "recheck the link file maybe broken";
}
$file = sha1_file('./Path/To/Your/File.zip');
echo"<br>is file hash valid?";
echo"hash = add the hash here<br>";
echo"hash of file :";
print($file);
?>
P2P programs like LimeWire utilize sha1 to identify files. However they do it in base32. Here's an utility class if you want to write a Gnutella client in PHP5
/**
Utility base32 SHA1 class for PHP5
Copyright (C) 2006 Karl Magdsick (original author for Python)
Angel Leon (ported to PHP5)
Lime Wire LLC
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
class SHA1 {
static $BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
/** Given a file it creates a magnetmix */
static function fileSHA1($file) {
$raw = sha1_file($file,true);
return SHA1::base32encode($raw);
} //fileSHA1
/** Takes raw input and converts it to base32 */
static function base32encode($input) {
$output = '';
$position = 0;
$storedData = 0;
$storedBitCount = 0;
$index = 0;
while ($index < strlen($input)) {
$storedData <<= 8;
$storedData += ord($input[$index]);
$storedBitCount += 8;
$index += 1;
//take as much data as possible out of storedData
while ($storedBitCount >= 5) {
$storedBitCount -= 5;
$output .= SHA1::$BASE32_ALPHABET[$storedData >> $storedBitCount];
$storedData &= ((1 << $storedBitCount) - 1);
}
} //while
//deal with leftover data
if ($storedBitCount > 0) {
$storedData <<= (5-$storedBitCount);
$output .= SHA1::$BASE32_ALPHABET[$storedData];
}
return $output;
} //base32encode
}