Delphi: быстрый поток на sha256 для больших файлов (100 МБ)

У меня есть функция для создания sha256 для потока. Эта функция занимает около 5 секунд для FileStream размером 100 МБ. Любые советы, как сделать это быстрее?

function GetStreamToHashSHA256Hex(const Content: TStream): string;
const
  //ChunkSize = $F000; // 61440
  ChunkSize = 1024*1024; // 1 mb
var
  aHashSHA2:  THashSHA2;
  aBytes:     TBytes;
  aBytesRead: Integer;
begin
  aHashSHA2 := THashSHA2.create;

  SetLength(aBytes, ChunkSize);
  try
    //Content.Seek(0, soBeginning);
    Content.Position := 0;

    repeat
      aBytesRead := Content.Read(aBytes, ChunkSize);
      if (aBytesRead = 0) then Break; // Done
      aHashSHA2.Update(aBytes, aBytesRead);
    until False;

    //Content.Seek(0, soBeginning);
    Content.Position := 0;

    Result := aHashSHA2.HashAsString;
  finally
    aHashSHA2.Reset;
    aBytes := nil;
  end;
end;

в Берлине есть THashSHA2.GetHashString(const AString: string; AHashVersion: TSHA2Version)

ar099968 22.05.2019 17:18

Попробуйте фастмм32. Я видел, что иногда это дает много улучшений.

jimsweb 22.05.2019 18:34

@jimsweb это может иметь место для кода, который выполнял много выделений кучи, но этого не произойдет. Кроме того, mm по умолчанию в Delphi — FastMM.

David Heffernan 22.05.2019 19:37

Вы можете попробовать github.com/Xor-эль/HashLib4Pascal Он поставляется с тестовым проектом, на моем компьютере он показывает 114 МБ/с для SHA2-256 (Win32, Release).

Andrei Galatyn 22.05.2019 21:43

Вы можете попробовать реализацию MS Crypto, которая, согласно ответу, намного быстрее, чем THashSHA2: stackoverflow.com/a/43480899/937125

kobik 23.05.2019 10:03
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
5
364
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другими словами, вы можете попробовать альтернативные реализации хеширования, чтобы увидеть, работают ли другие быстрее. Очевидным местом для начала являются те из проекта Synopse.

Вы также должны сравнить производительность вашего кода с производительностью, полученной с помощью респектабельной хеш-программы командной строки. Это даст вам представление о том, какая производительность достижима.

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

Remy Lebeau 22.05.2019 17:52

@remy нет, это ничего не изменит

David Heffernan 22.05.2019 18:10

вы уверены? Потому что у меня есть приложения, которые значительно ускоряются при использовании файлов с отображением памяти по сравнению с традиционным чтением с диска.

Remy Lebeau 22.05.2019 20:29

@Remy Последовательное чтение с диска 100 МБ фрагментами по 1 МБ практически не занимает времени. Проблема, безусловно, в дрянном хеш-коде.

David Heffernan 22.05.2019 20:46

@RemyLebeau Я получаю время чтения файла размером 100 МБ за 40 мс на локальном SSD-накопителе. Так что нет, я не думаю, что доступ к данным — это то, что здесь отнимает время.

David Heffernan 22.05.2019 21:01

Да, ну, многие люди (включая меня) не могут позволить себе роскошь использовать SSD, так что...

Remy Lebeau 22.05.2019 23:54

Использование твердотельных накопителей в 2019 году — не роскошь

Stefan Glienke 23.05.2019 00:29

@Remy Что, черт возьми, вы используете, если для чтения 100 МБ с вашего диска требуется лучшая часть 5 с? Вы все еще на дискетах? Чем тут может помочь картирование памяти? В какой-то момент он должен оторваться от диска (или дискового кеша). Отображение памяти не ускоряет чтение с диска.

David Heffernan 23.05.2019 00:36

@StefanGlienke это для людей (таких как я), у которых нет денег, чтобы купить их...

Remy Lebeau 23.05.2019 01:00

@StefanGlienke здесь, в Алжире, цена SSD — это доход наших клиентов (конечных пользователей) после одного месяца напряженной работы, а цена HDD — это доход за неделю. Так что на самом деле это вопрос программного ускорения, а не аппаратного, если вы хотите конкурировать.

Nasreddine Galfout 23.05.2019 01:05

Я должен согласиться с предложением Дэвида попробовать другие библиотеки хеширования. И главная причина этого в том, что THashSHA2 — это программная реализация алгоритма хеширования. Но поскольку большинство современных ЦП уже имеют встроенную поддержку аппаратного ускорения хеширования данных с использованием библиотеки, которая может использовать это аппаратное ускорение, это даст вам гораздо лучшую общую производительность.

SilverWarior 25.05.2019 20:39

Другие вопросы по теме