Программа "Генератор хешей" - Pascal
Формулировка задачи:
Здравствуйте.
Хочу сделать программу-генератор хешей по алгоритму sha224. Необходимо, чтобы можно было задать диапазон значений (шифруются числовые значения с 31 символом), каждому элементу которого подбирается соответствующее значение хеша с сохранением значений в формате число:хеш. Возможно это реализовать или может есть какие-то готовые решения?
Для примера:
Задаём диапазон значений от 0.000000000000000000000000000001 до 0.60000000000000000000000000000. Для каждого значения из этого диапазона подобрать хеш по sha224.
Решение задачи: «Программа "Генератор хешей"»
textual
Листинг программы
program HashCalc;
{$mode delphi}
uses
SysUtils,
tfTypes,
tfBytes,
tfHashes;
procedure CalcHash(const s: string);
const
BufSize = 32;
var
HashName: string='SHA224';
HashArr: THash;
Buffer: array[0 .. BufSize - 1] of Byte;
L: Integer;
begin
HashArr:= THash(HashName);
for L:=1 to 32 do Buffer[L-1]:=ord(s[L]);
HashArr.Update(Buffer, BufSize);
Writeln(s, ': ', HashArr.Digest.ToHex);
end;
var
s1:string;
s2:string;
fout:string;
i:integer;
begin
write('Start:');readln(s1);
if s1='' then s1:='0.000000000000000000000000000001';
write('Finish:');readln(s2);
if s2='' then s2:='0.600000000000000000000000000000';
write('Output file name:');readln(fout);
assignfile(output,fout);
rewrite(output);
repeat
CalcHash(s1);
s1[length(s1)]:=chr(ord(s1[length(s1)])+1);
for i:=length(s1) downto 3 do
if s1[i]>'9' then begin s1[i-1]:=chr(ord(s1[i-1])+1);s1[i]:='0';end;
until s1>s2;
close(output);
end.
Объяснение кода листинга программы
- На строке 16 объявляется переменная
HashNameтипа string и ей присваивается значениеSHA224, которое представляет название алгоритма хеширования. - На строке 17 объявляется переменная
HashArrтипаTHashи инициализируется значением THash(HashName), чтобы определить тип хеш-функции. - На строке 18 объявляется массив
Bufferразмером 32 байта для буфера хранения данных. - На строке 19 объявляется переменная
Lтипа Integer для использования в цикле. - Начиная с 21 строки начинается процедура
CalcHash, которая принимает на вход строкуsдля хеширования. - Внутри процедуры значение переменной
HashNameиспользуется для инициализацииHashArrалгоритмом хеширования. - Затем создается цикл, который перебирает первые 32 символа строки
sи записывает их байтовые значения в массивBuffer. - После этого вызывается метод
UpdateобъектаHashArrдля обновления и вычисления хеша на основе данных из буфера. - Полученное значение хеша выводится на экран с помощью процедуры
Writelnна строке 24. - На строке 26 объявляются переменные
s1,s2иfoutдля хранения вводимых имен файлов и значений. - На строке 29 открывается файл с именем, заданным пользователем.
- Затем начинается цикл, который вызывает процедуру
CalcHashдля каждой строки отs1доs2и увеличивает значениеs1в цикле с помощью инкремента. - Цикл заканчивается, когда
s1превышает значениеs2. - На строке 39 закрывается файл после завершения работы программы.