Skip to content

Latest commit

 

History

History
73 lines (54 loc) · 2.63 KB

GetDigestAsString.md

File metadata and controls

73 lines (54 loc) · 2.63 KB

MD5 How-to: How To Get a Digest String

Applies to: ~>1.0

You often see MD5 hashes or digests displayed as strings like this: c8b029b7698b23a5962e7cc21a75653a

These strings are always 32 characters long and are made up hexadecimal characters representing the 16 bytes of a MD5 digest.

It's easy to get a MD5 hash string from a TPJMD5Digest record. You just assign it to a string variable:

var
  D: TPJMD5Digest;
  S: string;
begin
  D := TPJMD5.Calculate('Foo');
  S := D;
  ShowMessage(S);
end;

This code works because TPJMD5Digest has an Implicit cast operator that automatically creates a string representation of the hash when it is assigned to a string.

This conversion also works when a digest record is used in a string context, such as when passed as a string parameter to a routine or method. For example:

var
  D: TPJMD5Digest;
begin
  D := TPJMD5.Calculate('Foo');
  ShowMessage(D);
end;

This works because ShowMessage takes a string parameter.

You can also explicitly cast a TPJMD5Digest record to a string. This is useful when it is passed as a parameter to something like the array of const parameter of routines like Format and ShowMessageFmt where the type is not recognised. In this case you do:

var
  D: TPJMD5Digest;
begin
  D := TPJMD5.Calculate('Foo');
  ShowMessageFmt('Digest = %s', [string(D)]);
end;

You can't pass D directly here because, behind the scenes, the second parameter of ShowMessageFmt is converted to an array of TVarRec records, and no suitable implicit cast is defined in TPJMD5Digest. However, a cast to string works because the compiler knows how to convert strings to TVarRec.

Similarly, if you have a console application and want to write a TPJMD5Digest record as a string to the console you need the string cast otherwise WriteLn and its ilk don't understand the type:

var
  D: TPJMD5Digest;
begin
  D := TPJMD5.Calculate('Foo');
  WriteLn('Digest = ', string(D));
end;

You can also assign a string to a TPJMD5Digest providing the string contains a valid hex representation of a MD5 digest. This uses another Implicit cast operator

See Also

Links