Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить Sha-1 хэш в виде hex-значения 
V
    Опции темы
Kinjalka
Дата 9.7.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Здравствуйте.
Делаю плагин для кинобазы (http://wiki.kinobaza.tv/API), там есть пункт(GET /films/search-by-file) поиска по хешу файла, в документации это описано так - "Хеши рассчитываются путем получения sha1 хеша первого мегабайта данных в виде hex значения (40 символов)"

Используя DCPcrypt2, получил такой код:
Код

type
...
    Sha1: TDCP_sha1;
...
var
  FS: TFileStream;
  Fail: Boolean;
  Read: Int64;
  buf: AnsiString;
  Hash: array of Cardinal;
  HashStr: AnsiString;
  TheHash: TDCP_hash;
begin
    TheHash := TDCP_hash(Sha1);
    TDCP_hash(Sha1).Init;
    try
      FS := nil;
      FS := TFileStream.Create(nfo.PathFileName, fmOpenRead or fmShareDenyRead);
    except
      Fail := True;
      FS.Free;
    end;

    if not Fail then
    begin
      Read := 0;

      try
        Log(' reading file...');
        SetLength(Buf, 1048576);

        repeat
          Read := FS.Read(Buf[1], 1048576);
          TheHash.UpdateStr(Buf);
        until Read <> 1048576;
      except
        Fail := True;
      end;
      FS.Free;
    
      if (not Fail) and (Read <> 0) then
      begin
        Log(' creating hash');
        SetLength(Hash, TheHash.HashSize div 8);
        TheHash.Final(Hash[0]);
        for I := 0 to Length(Hash)-1 do
        begin
          HashStr := HashStr + IntToHex(Hash[I], 2);
        end;

        Log(' HashStr: "' + HashStr + '" (len: ' + IntToStr(Length(HashStr)) + ')');


Так как с hex'ом работаю в первые, поэтому моментов непонятных несколько smile Но самый главный, это то, что я не пойму как тут указать, что мне нужно только 40 первых(если я правильно понял документацию кинобазы) символов хеша: жестко задать в SetLength? Или хитрить со вторым аргументом в IntToHex? Подскажите правильно решение, пожалуйста smile
А то длина хеша в результате постоянно разная, и от этого нет уверенности что хеш правильный(тогда бы можно было просто Copy(HashStr, 1, 40), я полагаю).

Используется Delphi XE.

Заранее благодарю за помощь.


Это сообщение отредактировал(а) Kinjalka - 9.7.2011, 10:15
PM MAIL WWW ICQ Skype   Вверх
xkor
Дата 9.7.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.1.2007
Где: Питер

Репутация: 2
Всего: 4



Kinjalka, SHA-1 генерирует 160-битное хеш-значение - это 20 байт, соответственно в виде хекса они будут 40 символами, так что с размером ничего шаманить не нужно.
"Hash: array of Cardinal" - почему Cardinal вы выбрали хоть убей не понимаю...
в общем вот примерный код переделанный:
Код

type
...
    Sha1: TDCP_sha1;
...
var
  FS: TFileStream;
  Fail: Boolean;
  Read: Int64;
  buf: AnsiString;
  Hash: array[0..19] of Byte;
  HashStr: AnsiString;
begin
    Sha1:= TDCP_sha1.Create(nil);
    Sha1.Init;
    try
      FS := nil;
      FS := TFileStream.Create(nfo.PathFileName, fmOpenRead or fmShareDenyRead);
    except
      Fail := True;
      FS.Free;
    end;
    if not Fail then
    begin
      Read := 0;
      try
        Log(' reading file...');
        SetLength(Buf, 1048576);
        repeat
          Read := FS.Read(Buf[1], 1048576);
          Sha1.UpdateStr(Buf);
        until Read <> 1048576;
      except
        Fail := True;
      end;
      FS.Free;
    
      if (not Fail) and (Read <> 0) then
      begin
        Log(' creating hash');
        Sha1.Final(Hash);
        for I := 0 to High(Hash) do
        begin
          HashStr := HashStr + IntToHex(Hash[I], 2);
        end;
        Log(' HashStr: "' + HashStr + '" (len: ' + IntToStr(Length(HashStr)) + ')');

PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kinjalka
Дата 9.7.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Спасибо вам большое!
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.