Question

Salut je dois générer un SHA sur un 5 fichier Gig

Connaissez-vous une chaîne non basée sur la bibliothèque Delphi qui peut le faire?

Était-ce utile?

La solution

Vous devez utiliser DCPcrypt v2 et lire votre fichier tamponne et alimenter le SHA Hasher avec le tampon jusqu'à ce que vous avez lu le fichier 5GB complet.

Si vous voulez savoir comment lire un fichier volumineux en mémoire tampon, voir ma réponse à propos de une copie de fichier à l'aide tampon personnalisé.

dans le concept (pas vrai code delphi!):

function GetShaHash(const AFilename: String)
begin
  sha := TSHAHasher.Create;
  SetLength(Result, sha.Size);
  file := OpenFile(AFilename, GENERIC_READ);
  while not eof file do
  begin
     BytesRead := ReadFile(file, buffer[0], 0, 1024 * 1024);
     sha.Update(buffer[0], BytesRead);
  end;
  sha.Final(Result[0]); 
  CloseFile(file);
end;

Autres conseils

Je recommande CRC / Hash de Wolfgang Ehrhardt.
http://home.netsurf.de/wolfgang.ehrhardt/

Il est rapide et « peut être compilé avec la plus récente Pascal (TP 5 / 5.5 / 6, BP 7, VP 2.1, CPF 1.0 / 2.0 / 2.2) et les versions Delphi (testé avec V1 à V7 / 9/10) ».

Je l'ai utilisé avec D11 / D12 aussi.

Si je me souviens bien, Indy est livré avec plusieurs méthodes de hachage d'une base de flux.

Il existe une interface Delphi pour OpenSSL, est-ce pas?

Cela devrait vous fournir de meilleures performances.

@Davy Landman, merci, votre réponse m'a vraiment aidé. Voici le code que je fini par utiliser:

function HashFileSHA256(const fileName: String): String;
var
  sha256: TDCP_sha256;
  buffer: array[0..1024*1024] of byte;
  i, bytesRead: Integer;
  streamIn: TFileStream;
  hashBuf: array[0..31] of byte;
begin
  // Initialization
  Result := '';
  streamIn := TFileStream.Create(fileName, fmOpenRead);
  sha256 := TDCP_sha256.Create(nil);
  for i:=0 to Sizeof(buffer) do
    buffer[i] := 0;
  for i:=0 to Sizeof(hashBuf) do
    hashBuf[i] := 0;
  bytesRead := -1;

  // Compute
  try
    sha256.Init;
    while bytesRead <> 0 do
    begin
      bytesRead := streamIn.Read(buffer[0], Sizeof(buffer));
      sha256.Update(buffer[0], bytesRead);
    end;
    sha256.Final(hashBuf);
    for I := 0 to 31 do
      Result := Result + IntToHex(hashBuf[i], 2);
  finally
    streamIn.Free;
    sha256.Free;
  end;

  Result := LowerCase(Result);
end;

P.S .: Je suis un débutant avec Pascal, donc ce code le plus probable suce. Mais je l'ai testé sur le programme d'installation MSYS2 et a été en mesure de vérifier le hachage, de sorte que c'est agréable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top