Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сравнение хэшей MD5 из MySQL в Delphi без использования HEX/UNHEX

Delphi , Базы данных , SQL

Введение

Хранение хэшей 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




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


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 13:53:25/0.0033929347991943/0