PHP Conference Japan 2024

sha1_file

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

sha1_file計算檔案的 sha1 雜湊值

描述

sha1_file(字串 $filename, 布林 $binary = false): 字串|false

使用 » US Secure Hash Algorithm 1,計算由 filename 指定之檔案的 sha1 雜湊值,並傳回該雜湊值。該雜湊值為 40 個字元的十六進位數字。

參數

filename

要雜湊之檔案的檔案名稱。

binary

當為 true 時,傳回長度為 20 的原始二進位格式摘要。

傳回值

成功時傳回字串,否則傳回 false

範例

範例 1 sha1_file() 範例

<?php
foreach(glob('/home/Kalle/myproject/*.php') as $ent)
{
if(
is_dir($ent))
{
continue;
}

echo
$ent . ' (SHA1: ' . sha1_file($ent) . ')', PHP_EOL;
}
?>

參見

  • hash_file() - 使用給定檔案的內容產生雜湊值
  • hash_init() - 初始化增量雜湊上下文
  • sha1() - 計算字串的 sha1 雜湊值

新增筆記

使用者貢獻的筆記 3 筆筆記

49
xijque at gmail dot com
13 年前
僅供記錄 -

正如某些人所指出的,您有兩種產生檔案雜湊值的方法
方法 1 [此函式]:sha1_file($file)
方法 2:sha1(file_get_contents($file))

務必瞭解這兩種方法並不相同。如果它們相同,我非常懷疑這個函式是否會存在。

據我所知,主要區別在於檔案內容的載入方式。第二種方法會在將整個 $file 傳遞給 sha1($str) 之前,將其載入記憶體中。然而,第二種方法會在建立雜湊值時,依據需要載入 $file 的內容。

如果您可以保證只會雜湊相對較小的檔案,這種差異幾乎沒有意義。但如果您有較大的檔案,將整個檔案載入記憶體中不是一個好主意:最好的情況是,當您的伺服器嘗試處理請求時,速度會變慢;最壞的情況是,您會耗盡記憶體,而根本無法取得雜湊值。

如果您決定自己載入檔案內容,而不使用此函式,請務必記住這一點。在我的系統上,我能夠使用此函式在 22 秒內產生一個 2.6GB 檔案的雜湊值,而第二種方法則無法,因為記憶體不足錯誤(這花了 185 秒)。
3
gubatron at gmail dot com
18 年前
像 LimeWire 這樣的 P2P 程式會使用 sha1 來識別檔案。但它們以 base32 的方式進行。如果您想在 PHP5 中編寫 Gnutella 用戶端,以下是一個實用程式類別

/**
PHP5 的實用 base32 SHA1 類別
Copyright (C) 2006 Karl Magdsick (Python 的原始作者)
Angel Leon (移植到 PHP5)
Lime Wire LLC

這個程式是自由軟體;您可以重新發佈它和/或
依據 GNU 通用公共授權條款修改它
由自由軟體基金會發佈;可以是第 2 版
的授權,或(您可選擇)任何後續版本。

此程式的發佈希望它會有所幫助,
但不提供任何擔保;甚至不提供對於
適銷性或特定用途適用性的默示擔保。請參閱
GNU 通用公共授權以取得更多詳細資訊。

您應該已收到一份隨此程式一同提供的 GNU 通用公共授權副本;
如果沒有,請寫信給自由軟體
基金會,地址:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA。
*/
class SHA1 {
static $BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

/** 給定一個檔案,它會建立一個 magnetmix */
static function fileSHA1($file) {
$raw = sha1_file($file,true);
return SHA1::base32encode($raw);
} //fileSHA1

/** 採用原始輸入並將其轉換為 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;

//盡可能從 storedData 中取出資料
while ($storedBitCount >= 5) {
$storedBitCount -= 5;
$output .= SHA1::$BASE32_ALPHABET[$storedData >> $storedBitCount];
$storedData &= ((1 << $storedBitCount) - 1);
}
} //while

//處理剩餘的資料
if ($storedBitCount > 0) {
$storedData <<= (5-$storedBitCount);
$output .= SHA1::$BASE32_ALPHABET[$storedData];
}

return $output;
} //base32encode

}
-2
schiros at invisihosting dot com
17 年前
如果您有一個允許使用者上傳檔案的腳本,並且想要防止多次上傳相同檔案

<?
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 "您已上傳過該檔案";
}
else{
// 執行某些操作
}
}

?>
To Top