Как рассчитать хэш файла размером 1 терабайт и более?

Итак, у меня есть пара файлов образа резервной копии системы размером около 1 терабайта, и я хочу быстро вычислить хэш каждого из них (предпочтительно SHA-1).

Сначала я пытался вычислить хэш md5, прошло 2 часа, а хэш так и не был посчитан (что очевидно для больших файлов до 1 ТБ).

Итак, есть ли какая-либо программа/реализация, которая может быстро хешировать файл размером 1 ТБ?

Я слышал о Tree-Hashing, который одновременно хеширует части файла, но пока не нашел никакой реализации.


person Light Flow    schedule 28.03.2014    source источник


Ответы (3)


Если у вас есть файл размером 1 миллион МБ, и ваша система может прочитать этот файл со скоростью 100 МБ/с, то

  • 1TB * 1000(TB/GB) = 1000 GB
  • 1000 ГБ * 1000 (МБ/ГБ) = 1 миллион МБ
  • 1 миллион МБ/100(МБ/с) = 10 тысяч секунд
  • 10000s/3600(s/hr) = 2.77... hr
  • Таким образом, система со скоростью 100 МБ/с имеет жесткий порог в 2,77... часа даже для чтения файла, даже до того, как может потребоваться дополнительное общее время для вычисления хэша.

Ваши ожидания, вероятно, нереалистичны — не пытайтесь вычислить более быстрый хэш, пока не сможете выполнить более быстрое чтение файла.

person Anti-weakpasswords    schedule 30.03.2014
comment
Вы правы, но я сомневаюсь, что моя система сможет прочитать файл со скоростью 100 МБ/с :( Существуют ли альтернативные способы более быстрого чтения файла? - person Light Flow; 31.03.2014
comment
Чтобы читать файл быстрее, вам нужно более быстрое хранилище, что в основном означает, что вы собираетесь потратить много денег. Распределение резервной копии по нескольким дискам с помощью программы резервного копирования или RAID, или SSD, или SSD в RAID, или PCIe SSD , или RAMDisk; все будет работать. В качестве альтернативы, если вы используете программное обеспечение для резервного копирования с открытым исходным кодом, пусть оно вычисляет хеш во время записи вывода. Я не могу изменить законы физики! - person Anti-weakpasswords; 01.04.2014
comment
Хм, да, кажется, это правда. Тем не менее, я потрачу некоторое время, прежде чем приму ваш ответ, на случай, если кто-то еще захочет что-то добавить. - person Light Flow; 03.04.2014

Старый и уже отвеченный, но вы можете попробовать выбрать определенные фрагменты файла.

Где-то я нашел решение Perl, и оно кажется эффективным, код не мой:

#!/usr/bin/perl

use strict;
use Time::HiRes qw[ time ];
use Digest::MD5;

sub quickMD5 {
    my $fh = shift;
    my $md5 = new Digest::MD5->new;

    $md5->add( -s $fh );

    my $pos = 0;
    until( eof $fh ) {
        seek $fh, $pos, 0;
        read( $fh, my $block, 4096 ) or last;
        $md5->add( $block );
        $pos += 2048**2;
    }
    return $md5;
}

open FH, '<', $ARGV[0] or die $!;
printf "Processing $ARGV[0] : %u bytes\n", -s FH;

my $start = time;
my $qmd5 = quickMD5( *FH );
printf "Partial MD5 took %.6f seconds\n", time() - $start;
print "Partial MD5: ", $qmd5->hexdigest, "\n";

По сути, скрипт выполняет MD5 для первых 4 КБ для каждого 4-мегабайтного блока в файле (фактически исходный делал каждый 1 МБ).

person realpclaudio    schedule 26.05.2016
comment
Хм, интересная идея! Однако будет проблема, если только небольшая часть файла будет повреждена после первых 4 КБ блока 2 МБ. Но в любом случае, это что-то хорошее, чего я не знал! Спасибо, что поделился!! :) - person Light Flow; 26.05.2016
comment
Обычно я делаю md5 из файлов размером 3,4 ТБ, которые я ЕЖЕДНЕВНО копирую на внешнее хранилище. К настоящему времени у меня не было никаких сюрпризов, кстати, со стандартными характеристиками NAS полный MD5, также с учетом времени копирования, для меня не вариант! Также учтите, что вы выполняете MD5 из более чем 250000/300000 блоков данных, что ДОЛЖНО быть приемлемо безопасным для таких больших файлов. - person realpclaudio; 26.05.2016
comment
Как использовать этот сценарий для проверки всей файловой системы и записи результатов в файл вместо проверки только одного файла? - person Sebastian Roy; 12.06.2019
comment
Вам просто нужно вызвать его извне (т.е. с помощью сценария bash). Не могу кодировать прямо сейчас, но если вы направите вывод команды find в соответствующие папки файловой системы в скрипт perl, это должно помочь. в вашем сценарии bash у вас должно быть что-то вроде find /folder/ -type f | xargs perl_script и перенаправить в файл журнала. - person realpclaudio; 13.06.2019

Я предлагаю вам взглянуть на некриптографические хэши (например: xxhash и murmur3), они намного быстрее, чем md5, пока, конечно, вы не достигнете максимальной скорости чтения.

person gmansour    schedule 02.07.2021