SHA1 哈希 Delphi 与 Python
SHA1 Hash Delphi vs Python
我尝试对 delphi 和 python 中的相同字符串进行哈希处理,但我得到了不同的哈希值?
Python:
d = bytes('pr', 'utf-8')
print((sha1(d).digest()).hex())
output: 5498d9b96ed2832e04a90c4ac2ab71f869b2bfdc
Delphi XE7:
...
bytes := TEncoding.UTF8.GetBytes('pr');
BinToHex(sha1Digest2(bytes);
...
output: 1ca1a00b40b8350d15cdce2935965d88b7798719
Function TForm1.sha1Digest2(buffer: TBytes): TBytes;
Var
HashSHA1: THashSHA1;
Begin
HashSHA1 := THashSHA1.Create;
HashSHA1.Update(buffer, SizeOf(buffer));
Result := HashSHA1.HashAsBytes;
End;
Function TForm1.binToHex(Const bin: Array Of Byte): String;
Const
HexSymbols = '0123456789ABCDEF';
Var
I: Integer;
Begin
SetLength(Result, 2 * Length(bin));
For I := 0 To Length(bin) - 1 Do
Begin
Result[1 + 2 * I + 0] := HexSymbols[1 + bin[I] Shr 4];
Result[1 + 2 * I + 1] := HexSymbols[1 + bin[I] And [=13=]F];
End;
End;
我做错了什么?提前致谢!
您正在使用 Sizeof(buffer)
而不是 Length(buffer)
!所以你正在散列 4 个字节而不是 2 个字节。Sizeof(<TBytes>)
总是 4,因为它在内部是一个指针。
我尝试对 delphi 和 python 中的相同字符串进行哈希处理,但我得到了不同的哈希值?
Python:
d = bytes('pr', 'utf-8')
print((sha1(d).digest()).hex())
output: 5498d9b96ed2832e04a90c4ac2ab71f869b2bfdc
Delphi XE7:
...
bytes := TEncoding.UTF8.GetBytes('pr');
BinToHex(sha1Digest2(bytes);
...
output: 1ca1a00b40b8350d15cdce2935965d88b7798719
Function TForm1.sha1Digest2(buffer: TBytes): TBytes;
Var
HashSHA1: THashSHA1;
Begin
HashSHA1 := THashSHA1.Create;
HashSHA1.Update(buffer, SizeOf(buffer));
Result := HashSHA1.HashAsBytes;
End;
Function TForm1.binToHex(Const bin: Array Of Byte): String;
Const
HexSymbols = '0123456789ABCDEF';
Var
I: Integer;
Begin
SetLength(Result, 2 * Length(bin));
For I := 0 To Length(bin) - 1 Do
Begin
Result[1 + 2 * I + 0] := HexSymbols[1 + bin[I] Shr 4];
Result[1 + 2 * I + 1] := HexSymbols[1 + bin[I] And [=13=]F];
End;
End;
我做错了什么?提前致谢!
您正在使用 Sizeof(buffer)
而不是 Length(buffer)
!所以你正在散列 4 个字节而不是 2 个字节。Sizeof(<TBytes>)
总是 4,因为它在内部是一个指针。