php 查文件sha1 内存不足,PHP 计算文件的 sha1 散列值

用户评论:

xijque at gmail dot com (2011-07-05 07:13:33)

Just for the record -

As some have pointed out, you have two ways to generate the hash of a file:

Method 1 [this function]: sha1_file($file)

Method 2: sha1(file_get_contents($file))

It's important to realize that these two methods are NOT the same thing. If they were, I seriously doubt this function would exist.

The key difference, as far as I can tell, is how the file's contents are loaded. The second method loads the entirety of $file into memory before passing it to sha1($str). Method two, however, loads the contents of $file as they are needed to create the hash.

If you can guarantee that you'll only ever have to hash relatively small files, this difference means very little. If you have larger ones, though, loading the entirety of file into memory is a bad idea: best case, you slow down your server as it tries to handle the request; worse case, you run out of memory and don't get your hash at all.

Just try to keep this in mind if you decide to load the file's contents yourself, in lieu of using this function. On my system, I was able to use this function to generate the hash of a 2.6GB file in 22 seconds, whereas I could not with the second method, due to an out-of-memory error (which took 185 seconds).

Goodlookinguy at NRG's RPG dot com (2008-11-25 19:01:27)

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.

$date : 11/25/08

$site : http://nrgsrpg.com

$copyright: This can be redistributed at will.

*///    $des  : For Hashing Files in all sorts of waysclasshashing{

public static functionfilehash($file,$hash) {

if (file_exists($file)) {

returnhash($hash,file_get_contents($file));

}

else {

return"Error Occurred: File Does Not Exist";

}

}

}

echohashing::filehash("index.php","sha1")."
";

echohashing::filehash("index.php","whirlpool")."
";

echohashing::filehash("index.php","sha512");?>

Have fun!

vista_ at live dot se (2008-11-23 04:05:21)

{

functionsha1_file($file=null)

{

if(is_null($file) || !file_exists($file))

{

returntrigger_error('File is null or does not exists');

}

returnsha1(file_get_contents($file));

}

}?>

Remember, it's important to write a corret url like this:

/home/snackzon/public_html/php/sha1.php

schiros at invisihosting dot com (2007-09-06 07:02:44)

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

}

}

?>

admin at cmsrevolution dot com (2006-08-04 20:02:25)

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

$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"
is file hash valid?";

echo"hash = add the hash here
";

echo"hash of file :";

print($file);?>

gubatron at gmail dot com (2006-02-10 07:02:53)

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值