Создание хеша на основании различных фалов

weldp

Новичок
Создание хеша на основании различных фалов

Привет
Мне нужен хеш, который Я буду получать на основании файла и что бы он был всегда одинаковый даже если переименовать файл!!!

Мне бы подошло использование - 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";

}
?>
 

weldp

Новичок
Я уже вроде понял где обшибся
PHP:
#!/usr/bin/php
<?php
$file="Fedora-8-i386-DVD.iso";
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)
    {
        $m=fread($handle,1024*1024);
        fseek($handle,-1024*1024,SEEK_END);
        $m .=fread($handle,1024*1024);
        $md=md5($m);
    }

    echo "\n".$md."\n";
    fclose($handle);
}
?>
-~{}~ 07.01.08 00:07:

надо ли говорить что есть несовпадение с перловым скриптом...
Может Я еще где-то завтыкал?
 

FractalizeR

Новичок
Не проще ли просто взять и сравнить результаты подсчета для одного и того же файла?
 

weldp

Новичок
>>Не проще ли просто взять и сравнить результаты подсчета для одного и того же файла?
Я так и делаю - результаты различаются

-~{}~ 07.01.08 01:48:

Вот это правильно отробатывает?
Читаем 1024*1024байт от начала и в эту же переменную столько же от конца?

PHP:
       $m=fread($handle,1024*1024); 
        fseek($handle,-1024*1024,SEEK_END); 
        $m .=fread($handle,1024*1024);
 

weldp

Новичок
Автор оригинала: cDLEON
Вы вообще понимаете что вы пишете?
Можно узнать что именно не так?
Я нето количество байт передаю?
Перед этим Я действительно не смотрел в мануал по функции

int fseek ( resource $handle , int $offset [, int $whence ] )
Устанавливает смещение в файле, на который ссылается handle . Новое смещение, измеряемое в байтах от начала файла, получается путём прибавления параметра offset к позиции, указанной в параметре whence , значения которого определяются следующим образом:

SEEK_END - Устанавливает смещение в размер файла плюс offset . (Чтобы перейти к смещению перед концом файла, вы должны передать отрицательное значение в параметр offset .)
 
Сверху