Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > MD5 PHP to Delphi


Автор: salik 15.3.2014, 11:35
Подскажите как код PHP переписать в Delphi.
Вот упрощенный вариант кода
Код

$hash = md5('123' . '123', TRUE);
echo htmlentities($hash, ENT_QUOTES); //  B�ôK�R5$[$�9�z�
echo htmlentities(md5($hash . '123', TRUE), ENT_QUOTES); // Áì²�Á6±�OïöÙ¥ 


С первым хешем проблем не возникает. Проверяю так
Код

function md5(SourceString: string): string;
var
  md5: TIdHashMessageDigest5;
  bt : Byte;
  ba : TBytes;
begin
   md5 := TIdHashMessageDigest5.Create;
  try
    ba := md5.HashString(SourceString, TEncoding.UTF8);
    Result := '';
    for bt in ba do Result := Result + Chr(ord(bt));
  finally
    FreeAndNil(md5);
  end;
end;

procedure TForm1.Btn1Click(Sender: TObject);
begin
  ShowMessage(md5('123123'));//B—ôK•R5$[$—9z“
end;

Не понятно как пых обрабатывает сложение $hash . '123' перед выполнением md5, а потом толи он мдпячит строку, толи массив байт.


Автор: Poseidon 16.3.2014, 11:50
Цитата(salik @  15.3.2014,  11:35 Найти цитируемый пост)
Не понятно как пых обрабатывает сложение $hash . '123' перед выполнением md5, а потом толи он мдпячит строку, толи массив байт.
Уверен, что этот вопрос стоит задавать в Delphi-разделе?

Автор: DYUMON 16.3.2014, 13:23
кодировки смотри. в php и delphi разные кодировки  поэтому и не сходятся хеши

Автор: salik 16.3.2014, 16:24
Цитата(DYUMON @ 16.3.2014,  14:23)
кодировки смотри. в php и delphi разные кодировки  поэтому и не сходятся хеши

Были бы разные кодировки, то первый хэш был кривой. 

Автор: DYUMON 18.3.2014, 13:56
циферкам пофиг кодировки

Автор: salik 18.3.2014, 18:12
Цитата(DYUMON @ 18.3.2014,  14:56)
циферкам пофиг кодировки

Скрипт PHP сохранен в кодировке UTF8 без бом.  Делфи XE3 + жестко указываю в функции UTF8. Я не стал заморачиваться и эту работу оставил скрипту, а результаты забираю пост запросом. Однако вопрос открыт.

Автор: DYUMON 19.3.2014, 21:38
Делал так 
Код

function GetMD5_UTF8(val: String): string;
var
  md5: TIdHashMessageDigest5;
  DestEncoding: TEncoding;
begin
  md5 := TIdHashMessageDigest5.Create;
  DestEncoding := TEncoding.GetEncoding(CP_UTF8);
  try
    result := LowerCase(md5.HashStringAsHex(val, TEncoding.UTF8));
  finally
    FreeAndNil(md5);
    FreeAndNil(DestEncoding);
  end;
end;

цифры и  латиницу нормально обрабатывает а вот кириллицу нет

хотя нет нормально обрабатывает. только пробовал не на php на MySql запросом  
Код

select md5('привет')

выдало
608333adc72f545078ede3aad71bfe74

Автор: salik 20.3.2014, 08:41
Цитата(DYUMON @  19.3.2014,  22:38 Найти цитируемый пост)
Делал так

Молодец что попробовал, только это не совсем то что нужно получить на выходе.
Вот ссылка на описани функции PHP http://www.php.net/manual/ru/function.md5.php. Обрати внимание на параметр True. Ты же предлагаешь получить результат вида 608333adc72f545078ede3aad71bfe74.
После выполнения
Код

md5('строка1', TRUE);

Мы должны получить бинарную строку.
Дальше мы должны выполнить следующее
Код

md5($бинарнаястрока1. 'частьстроки1', TRUE);

Получаем бинарную строку второго уровня и т.д.
Все это продемонстрировано в первом посте.

Автор: DYUMON 20.3.2014, 08:56
ты просто добавляешь соль и все .
Код

 GetMD5_UTF8(GetMD5_UTF8('123')+'123');


. в php  это обьединение

Автор: salik 20.3.2014, 09:24
Пробовал складывать 
Код

echo htmlentities(md5('B—ôK•R5$[$—9z“'.'123', true), ENT_QUOTES);

получаю '%��  (hÕÅH" ', как и в делфи, а надо плучить 'Áì²�Á6±�OïöÙ¥'
Возможно я не правильно складываю массивы.
Вот представьте есть два массива a,b : Tbytes.
Надо их сложить, получим третий массив размер которого a + b. Значения в который записываются последовательно: сначала из массива a, потом b. Если я что не так пишу, то поправьте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)