weldp
Новичок
Создание хеша на основании различных фалов
Привет
Мне нужен хеш, который Я буду получать на основании файла и что бы он был всегда одинаковый даже если переименовать файл!!!
Мне бы подошло использование - md5sum, но хеш строится как Я понимаю _для_всего_файла_ а значит что это очень долго если считать хеш для больших файлов. Я замерял время выполнения md5sum для 4Гб файла это порядка 2минут, Я же хочу не больше 5-ти секунд.
Kонтент у Меня - музыка, фильмы, архивы, образы. От 0 до ~16Gb
Можете обсчитать первый и последний мегабайт. Приблизительно так:
Теперь Я тоже самое пытаюсь повторить для ПХП. Вопрос - У Меня правильно всё работает?:
Привет
Мне нужен хеш, который Я буду получать на основании файла и что бы он был всегда одинаковый даже если переименовать файл!!!
Мне бы подошло использование - md5sum, но хеш строится как Я понимаю _для_всего_файла_ а значит что это очень долго если считать хеш для больших файлов. Я замерял время выполнения md5sum для 4Гб файла это порядка 2минут, Я же хочу не больше 5-ти секунд.
Kонтент у Меня - музыка, фильмы, архивы, образы. От 0 до ~16Gb
Можете обсчитать первый и последний мегабайт. Приблизительно так:
PHP:
#!/usr/bin/perl
use warnings;
use strict;
use Fcntl qw(SEEK_END);
use Digest::MD5;
our $file = $ARGV[0];
if(! -f $file)
{
die("not a regular file");
}
my $size = (stat($file))[7];
my $ctx = Digest::MD5->new();
my $buf = '';
open(FILE, '<', $file) or die("can't open file");
read(FILE, $buf, 1024*1024);
$ctx->add($buf);
if($size >= 1024*1024*2)
{
seek(FILE, 1024*1024, SEEK_END);
read(FILE, $buf, 1024*1024);
$ctx->add($buf);
}
close(FILE);
print($ctx->hexdigest, "\n");
PHP:
#!/usr/bin/php5
<?php
$file="Fedora-8-i386-DVD.iso"; //Размер 4Гб
if(is_file($file))
{
$handle=fopen($file,"r");
$sizebyte=sprintf("%u", filesize($file));
if($sizebyte<1024*1024*2)
{
$md=md5(fread($handle,filesize($file)));
}
if($sizebyte>=1024*1024*2)
{
$md=md5(fread($handle,1024*1024)+fseek($handle,1024*1024,SEEK_END));
}
echo "\n".$md."\n";
}
?>