Хранение хэшей MD5 в базах данных и их сравнение в приложениях на Delphi является распространенной задачей. В данной статье мы рассмотрим, как можно сравнивать хэши MD5, хранящиеся в MySQL в виде 16-байтных бинарных полей, с помощью кода на Object Pascal (Delphi), без использования функций HEX/UNHEX.
Проблема
При работе с хэшами MD5 в MySQL и Delphi возникает проблема с преобразованием между строками и бинарными данными. Это связано с тем, что MySQL хранит хэши в формате HEX (32 символа), в то время как Delphi работает с бинарными данными напрямую.
Решение
Для сравнения хэшей MD5 между MySQL и Delphi необходимо использовать прямые бинарные операции без преобразований в строковые представления. В примере кода ниже показано, как вставить данные в базу и как сравнить их с помощью Delphi.
procedure TForm1.InsertDataButtonClick(Sender: TObject);
var
MD5: TArray<Byte>;
begin
MD5 := THashMD5.GetHashBytes('123');
FDConnection1.Connected := TRUE;
FDQuery1.SQL.Text := 'INSERT INTO mytable (TEMP_MD5) VALUES(:MD5)';
FDQuery1.ParamByName('MD5').SetBlobRawData(Length(MD5), @MD5[0]);
FDQuery1.ExecSQL;
end;
procedure TForm1.ReadDataButtonClick(Sender: TObject);
var
MD5, MD5_123: TArray<Byte>;
FieldMD5: TField;
RecCnt: Integer;
begin
MD5_123 := THashMD5.GetHashBytes('123');
FDConnection1.Connected := TRUE;
FDQuery1.SQL.Text := 'SELECT TEMP_MD5 FROM mytable WHERE TEMP_MD5 = :MD5';
FDQuery1.ParamByName('MD5').SetBlobRawData(Length(MD5_123), @MD5_123[0]);
FDQuery1.Open;
RecCnt := 0;
while not FDQuery1.Eof do
begin
Inc(RecCnt);
FieldMD5 := FDQuery1.FieldByName('TEMP_MD5');
SetLength(MD5, FieldMD5.DataSize);
FieldMD5.GetData(MD5);
if CompareMem(@MD5[0], @MD5_123[0], Length(MD5)) then
Memo1.Lines.Add(RecCnt.ToString + ') MD5 совпадает')
else
Memo1.Lines.Add(RecCnt.ToString + ') MD5 не совпадает');
FDQuery1.Next;
end;
end;
Примечания
В примере используется метод GetData для получения данных из поля в буфер.
Для сравнения используется функция CompareMem, которая позволяет сравнивать блоки памяти.
Преобразование к строке для отображения результата в memo-контроле осуществляется функцией MD5ToStr, но для сравнения используются бинарные данные напрямую.
Заключение
возможно и эффективно, если правильно работать с бинарными данными и использовать функции сравнения памяти. Это позволяет избежать дополнительных преобразований и ускорить процесс сравнения.
В статье рассмотрено, как сравнить хэши MD5, хранящиеся в MySQL в бинарном виде, с хэшами, полученными в приложении на Delphi, без преобразования в строковые представления HEX.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS