HashBox.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 11253: HashBox.pas
  11. {
  12. { Rev 1.0 11/12/2002 09:18:10 PM JPMugaas
  13. { Initial check in. Import from FTP VC.
  14. }
  15. unit HashBox;
  16. interface
  17. uses
  18. IndyBox,
  19. IdHash, IdHashCRC, IdHashElf, IdHashMessageDigest;
  20. const
  21. MaxMemToLoad = 16777216; // 16MB
  22. type
  23. THashBox = class(TIndyBox)
  24. public
  25. procedure Test; override;
  26. end;
  27. implementation
  28. uses
  29. Classes,
  30. IdGlobal,
  31. SysUtils;
  32. { THashBox }
  33. procedure THashBox.Test;
  34. const
  35. CHashTests = 6;
  36. var
  37. FHash16 : TIdHash16;
  38. FHash32 : TIdHash32;
  39. FHashMD2 : TIdHash128;
  40. FHashMD4 : TIdHash128;
  41. FHashMD5 : TIdHash128;
  42. FHashElf : TidHashElf;
  43. finddata: TSearchRec;
  44. FS : TFileStream;
  45. MS : TMemoryStream;
  46. TS : TStream;
  47. TestData : TStringList;
  48. i : Integer;
  49. H16 : Word;
  50. H32 : LongWord;
  51. H128 : T4x4LongWordRecord;
  52. function ToHex : String;
  53. var
  54. T128 : T128BitRecord;
  55. i : Integer;
  56. begin
  57. result := '';
  58. Move(H128, T128, 16);
  59. for i := 0 to 15 do
  60. begin
  61. result := result + IntToHex(T128[i], 2);
  62. end;
  63. end;
  64. begin
  65. FHash16 := TIdHashCRC16.Create;
  66. FHash32 := TIdHashCRC32.Create;
  67. FHashMD2 := TIdHashMessageDigest2.Create;
  68. FHashMD4 := TIdHashMessageDigest4.Create;
  69. FHashMD5 := TIdHashMessageDigest5.Create;
  70. FHashElf := TIdHashElf.Create;
  71. TestData := TStringList.Create;
  72. i:= 0;
  73. try
  74. if FindFirst(GetDataDir + '*.ini', faAnyFile - faDirectory, finddata) = 0 then begin
  75. repeat
  76. inc(i);
  77. Status('Test ' + IntToStr(i) + ': ' + finddata.Name);
  78. TestData.LoadFromFile(GetDataDir + finddata.Name);
  79. if TestData.Count < CHashTests then
  80. begin
  81. raise Exception.Create('Insufficient test results in .ini for tests');
  82. end;
  83. // Change the extension to .dat
  84. FS := TFileStream.Create(GetDataDir+ChangeFileExt(finddata.Name, '.dat'), fmOpenRead or fmShareDenyNone);
  85. TS := FS;
  86. MS := TMemoryStream.Create;
  87. if FS.Size <= MaxMemToLoad then
  88. begin
  89. MS.LoadFromStream(FS);
  90. TS := MS;
  91. end;
  92. try
  93. // CRC-16
  94. H16 := FHash16.HashValue(TS);
  95. Status('HashCRC16, expected: ' + TestData[0] + ', got: '
  96. + IntToHex(H16, 4));
  97. Check(AnsiSameText(IntToHex(H16, 4), TestData[0]), 'Failed on HashCRC16.');
  98. // CRC-32
  99. TS.Seek(0, soFromBeginning);
  100. H32 := FHash32.HashValue(TS);
  101. Status('HashCRC32, expected: ' + TestData[1] + ', got: '
  102. + IntToHex(H32, 8));
  103. Check(AnsiSameText(IntToHex(H32, 8), TestData[1]), 'Failed on HashCRC32.');
  104. // MD2
  105. TS.Seek(0, soFromBeginning);
  106. H128 := FHashMD2.HashValue(TS);
  107. Status('HashMD2, expected: ' + TestData[2] + ', got: '
  108. + ToHex);
  109. Check(AnsiSameText(ToHex, TestData[2]), 'Failed on HashMD2.');
  110. // MD4
  111. TS.Seek(0, soFromBeginning);
  112. H128 := FHashMD4.HashValue(TS);
  113. Status('HashMD4, expected: ' + TestData[3] + ', got: '
  114. + ToHex);
  115. Check(AnsiSameText(ToHex, TestData[3]), 'Failed on HashMD4.');
  116. // MD5
  117. TS.Seek(0, soFromBeginning);
  118. H128 := FHashMD5.HashValue(TS);
  119. Status('HashMD5, expected: ' + TestData[4] + ', got: '
  120. + ToHex);
  121. Check(AnsiSameText(ToHex, TestData[4]), 'Failed on HashMD5.');
  122. // Elf
  123. TS.Seek(0, soFromBeginning);
  124. H32 := FHashElf.HashValue(TS);
  125. Status('HashElf, expected: ' + TestData[5] + ', got: '
  126. + IntToHex(H32, 8));
  127. Check(AnsiSameText(IntToHex(H32, 8), TestData[5]), 'Failed on HashElf.');
  128. finally
  129. FreeAndNil(FS);
  130. FreeAndNil(MS);
  131. end;
  132. until FindNext(finddata) <> 0;
  133. FindClose(finddata);
  134. end;
  135. finally
  136. FreeAndNil(TestData);
  137. FreeAndNil(FHash16);
  138. FreeAndNil(FHash32);
  139. FreeAndNil(FHashMD2);
  140. FreeAndNil(FHashMD4);
  141. FreeAndNil(FHashMD5);
  142. FreeAndNil(FHashElf);
  143. end;
  144. end;
  145. initialization
  146. TIndyBox.RegisterBox(THashBox, 'Hash', 'Misc');
  147. end.