Delphi: Comment calculer le hachage SHA d'un fichier volumineux
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?
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.