utchash.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. unit utchash;
  2. {$mode objfpc}
  3. {$H+}
  4. {$modeswitch functionreferences}
  5. {$modeswitch anonymousfunctions}
  6. {$macro on}
  7. interface
  8. uses
  9. Classes, SysUtils, fpcunit, testutils, testregistry, system.hash, generics.hashes;
  10. type
  11. { TTestHashBase }
  12. TTestHashBase = Class(TTestCase)
  13. Public
  14. class procedure AssertEquals(aMsg: String; aExpected, aActual: TBytes); overload;
  15. class function BytesToString(Bytes: TBytes): String;
  16. end;
  17. TTestHash = Class(TTestHashBase)
  18. Private
  19. FB : TBytes;
  20. Protected
  21. Procedure Setup; override;
  22. Procedure TearDown; override;
  23. Published
  24. Procedure TestDigestAsInteger;
  25. Procedure TestDigestAsString;
  26. Procedure TestDigestAsStringGUID;
  27. Procedure TestGetRandomString;
  28. Procedure TestToBigEndian;
  29. end;
  30. { TTestMD5 }
  31. TTestMD5 = class(TTestHashBase)
  32. private
  33. FMD5: THashMD5;
  34. protected
  35. procedure SetUp; override;
  36. procedure TearDown; override;
  37. property MD5 : THashMD5 Read FMD5;
  38. published
  39. procedure TestHashAsBytes;
  40. procedure TestHashAsBytesTwice;
  41. // Class functions
  42. Procedure TestGetHashBytesString;
  43. Procedure TestGetHashStringString;
  44. Procedure TestGetHashBytesStream;
  45. Procedure TestGetHashStringStream;
  46. Procedure TestGetHashBytesFromFile;
  47. Procedure TestGetHashStringFromFile;
  48. end;
  49. { TTestSha1 }
  50. TTestSha1 = Class(TTestHashBase)
  51. private
  52. FSHA1: THashSha1;
  53. protected
  54. procedure SetUp; override;
  55. procedure TearDown; override;
  56. property SHA1: THashSha1 Read FSHA1;
  57. published
  58. procedure TestHashAsBytes;
  59. procedure TestHashAsBytesTwice;
  60. // Class functions
  61. Procedure TestGetHashBytesString;
  62. Procedure TestGetHashStringString;
  63. Procedure TestGetHashBytesStream;
  64. Procedure TestGetHashStringStream;
  65. Procedure TestGetHashBytesFromFile;
  66. Procedure TestGetHashStringFromFile;
  67. end;
  68. { TTestSha2 }
  69. { Only tests SHA256, on the assumption that the other supported fphash mechanisms are also correct,
  70. so we basically test the wrapper layer around the FPC native routines... }
  71. TTestSha2 = Class(TTestHashBase)
  72. private
  73. FSHA2: THashSha2;
  74. protected
  75. procedure SetUp; override;
  76. procedure TearDown; override;
  77. property SHA2: THashSha2 Read FSHA2;
  78. published
  79. procedure TestHashAsBytes;
  80. procedure TestHashAsBytesTwice;
  81. // Class functions
  82. Procedure TestGetHashBytesString;
  83. Procedure TestGetHashStringString;
  84. Procedure TestGetHashBytesStream;
  85. Procedure TestGetHashStringStream;
  86. Procedure TestGetHashBytesFromFile;
  87. Procedure TestGetHashStringFromFile;
  88. end;
  89. { TTestFNV }
  90. TTestFNV = Class(TTestHashBase)
  91. private
  92. FFNV: THashFNV1a32;
  93. protected
  94. procedure SetUp; override;
  95. procedure TearDown; override;
  96. property FNV: THashFNV1a32 Read FFNV;
  97. Published
  98. Procedure TestHashAsBytes;
  99. Procedure TestGetHashBytes; // (const aData: UnicodeString): TBytes; static;
  100. Procedure TestGetHashStringUnicode; // (const aData: UnicodeString): UnicodeString; overload; static;
  101. Procedure TestGetHashStringRawByte; // (const aData: RawByteString): UnicodeString; overload; static;
  102. Procedure TestGetHashValueUnicode; // (const aData: UnicodeString): Integer; overload; static; inline;
  103. Procedure TestGetHashValueRawByte; // (const aData: RawByteString): Integer; overload; static; inline;
  104. Procedure TestGetHashValue; // (const aData; aLength: Cardinal; aInitialValue: Cardinal = FNV_SEED): Integer; overload; static; inline;
  105. end;
  106. { TTestFNV }
  107. { TTestBobJenkins }
  108. TTestBobJenkins = Class(TTestHashBase)
  109. private
  110. FBJ: THashBobJenkins;
  111. protected
  112. procedure SetUp; override;
  113. procedure TearDown; override;
  114. property BJ: THashBobJenkins Read FBJ;
  115. Published
  116. Procedure TestHashAsBytes;
  117. Procedure TestGetHashBytes; // (const aData: UnicodeString): TBytes; static;
  118. Procedure TestGetHashStringUnicode; // (const aData: UnicodeString): UnicodeString; overload; static;
  119. Procedure TestGetHashStringRawByte; // (const aData: RawByteString): UnicodeString; overload; static;
  120. Procedure TestGetHashValueUnicode; // (const aData: UnicodeString): Integer; overload; static; inline;
  121. Procedure TestGetHashValueRawByte; // (const aData: RawByteString): Integer; overload; static; inline;
  122. Procedure TestGetHashValue; // (const aData; aLength: Cardinal; aInitialValue: Cardinal = FNV_SEED): Integer; overload; static; inline;
  123. end;
  124. implementation
  125. Class Function TTestHashBase.BytesToString(Bytes : TBytes) : String;
  126. var
  127. I : Integer;
  128. begin
  129. Result:='[';
  130. For I:=0 to Length(Bytes)-1 do
  131. begin
  132. if I>0 then
  133. Result:=Result+', ';
  134. Result:=Result+'$'+Format('%x',[Bytes[i]]);
  135. end;
  136. Result:=Result+']';
  137. end;
  138. class procedure TTestHashBase.AssertEquals(aMsg: String; aExpected, aActual: TBytes);
  139. var
  140. I : Integer;
  141. begin
  142. AssertEquals(aMsg+': length',Length(aExpected),Length(aActual));
  143. For I:=0 to length(aExpected)-1 do
  144. AssertEquals(aMsg+': Byte['+IntTostr(i)+']','$'+IntToHex(aExpected[i]),'$'+IntToHex(aActual[i]));
  145. end;
  146. { TTestHash }
  147. procedure TTestHash.Setup;
  148. begin
  149. inherited Setup;
  150. SetLength(FB,0);
  151. end;
  152. procedure TTestHash.TearDown;
  153. begin
  154. SetLength(FB,0);
  155. inherited TearDown;
  156. end;
  157. procedure TTestHash.TestDigestAsInteger;
  158. Procedure DoDigestInt;
  159. begin
  160. THash.DigestAsInteger(FB);
  161. end;
  162. begin
  163. // class function DigestAsInteger(const aDigest: TBytes): Integer; static;
  164. SetLength(FB,4);
  165. FB[0]:=$01;
  166. FB[1]:=$02;
  167. FB[2]:=$03;
  168. FB[3]:=$04;
  169. AssertEquals('Integer',NtoBE($01020304),THash.DigestAsInteger(FB));
  170. SetLength(FB,5);
  171. AssertException('Size must be 4',EHashException,
  172. procedure
  173. begin
  174. THash.DigestAsInteger(FB);
  175. end);
  176. end;
  177. procedure TTestHash.TestDigestAsString;
  178. begin
  179. // class function DigestAsString(const aDigest: TBytes; UpperCase : Boolean = false): UnicodeString; static;
  180. SetLength(FB,4);
  181. FB[0]:=$01;
  182. FB[1]:=$0A;
  183. FB[2]:=$03;
  184. FB[3]:=$0D;
  185. AssertEquals('Lower','010a030d',THash.DigestAsString(FB));
  186. AssertEquals('Upper','010A030D',THash.DigestAsString(FB,True));
  187. end;
  188. Operator = (a,b : TGUID) : Boolean;
  189. var
  190. i: integer;
  191. begin
  192. Result:=(a.D1=b.D1)
  193. and (a.D2=b.D2)
  194. and (a.D3=b.D3)
  195. and (a.D3=b.D3);
  196. I:=0;
  197. While Result and (I<8) do
  198. begin
  199. Result:=(a.D4[i]=b.D4[i]);
  200. Inc(I);
  201. end;
  202. end;
  203. procedure TTestHash.TestDigestAsStringGUID;
  204. var
  205. I : integer;
  206. begin
  207. SetLength(FB,16);
  208. For I:=0 to 15 do
  209. FB[i]:=I;
  210. AssertEquals('THash.DigestAsStringGUID','{00010203-0405-0607-0809-0A0B0C0D0E0F}',THash.DigestAsStringGUID(FB));
  211. end;
  212. procedure TTestHash.TestGetRandomString;
  213. var
  214. S : UnicodeString;
  215. C : UnicodeChar;
  216. begin
  217. S:=THash.GetRandomString;
  218. AssertEquals('Default length',10,Length(S));
  219. For C in S do
  220. If not Pos(C,RandomStringChars)>0 then
  221. Fail(C+' not in allowed chars');
  222. end;
  223. procedure TTestHash.TestToBigEndian;
  224. var
  225. C : Cardinal;
  226. Q : UInt64;
  227. begin
  228. C:=$01020304;
  229. AssertEquals('Cardinal',NToBE(C),THash.ToBigEndian(C));
  230. Q:=UInt64($0102030405060708);
  231. AssertEquals('Cardinal',NToBE(Q),THash.ToBigEndian(Q));
  232. end;
  233. Const
  234. ExpectABCMD5 : TBytes = ($90, $1, $50, $98, $3C, $D2, $4F, $B0, $D6, $96, $3F, $7D, $28, $E1, $7F, $72);
  235. ExpectABCSha1 : TBytes = ($A9, $99, $3E, $36, $47, $6, $81, $6A, $BA, $3E, $25, $71, $78, $50, $C2, $6C, $9C, $D0, $D8, $9D);
  236. ExpectABCSha2 : TBytes = ($BA, $78, $16, $BF, $8F, $1, $CF, $EA, $41, $41, $40, $DE, $5D, $AE, $22, $23, $B0, $3, $61, $A3, $96, $17, $7A, $9C, $B4, $10, $FF, $61, $F2, $0, $15, $AD);
  237. ExpectABCFNV = Cardinal($1A47E90B);
  238. ExpectABCFNVUnicode = Cardinal($AE1E997D);
  239. ExpectABCBJ = 238646833;
  240. ExpectABCBJUnicode = Cardinal(4228388320);
  241. procedure TTestMD5.TestHashAsBytes;
  242. var
  243. Act : TBytes;
  244. begin
  245. FMD5.Update('abc');
  246. Act:=FMD5.HashAsBytes;
  247. // Writeln(BytesToString(Act));
  248. AssertEquals('abc',ExpectAbcMD5,Act);
  249. end;
  250. procedure TTestMD5.TestHashAsBytesTwice;
  251. var
  252. Act : TBytes;
  253. begin
  254. FMD5.Update('abc');
  255. Act:=FMD5.HashAsBytes;
  256. AssertEquals('abc',ExpectAbcMD5,Act);
  257. Act:=FMD5.HashAsBytes;
  258. AssertEquals('abc 2',ExpectAbcMD5,Act);
  259. end;
  260. procedure TTestMD5.TestGetHashBytesString;
  261. begin
  262. AssertEquals('abc',ExpectAbcMD5,THashMD5.GetHashBytes('abc'));
  263. end;
  264. procedure TTestMD5.TestGetHashStringString;
  265. begin
  266. AssertEquals('abc',THash.DigestAsString(ExpectAbcMD5),THashMD5.GetHashString('abc'));
  267. end;
  268. procedure TTestMD5.TestGetHashBytesStream;
  269. Var
  270. S : TStream;
  271. A : AnsiString;
  272. begin
  273. A:='abc';
  274. S:=TStringStream.Create(A);
  275. try
  276. AssertEquals('GetHashBytes',ExpectAbcMD5,THashMD5.GetHashBytes(S));
  277. finally
  278. S.Free;
  279. end;
  280. end;
  281. procedure TTestMD5.TestGetHashStringStream;
  282. Var
  283. S : TStream;
  284. A : AnsiString;
  285. begin
  286. A:='abc';
  287. S:=TStringStream.Create(A);
  288. try
  289. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectAbcMD5),THashMD5.GetHashString(S));
  290. finally
  291. S.Free;
  292. end;
  293. end;
  294. procedure TTestMD5.TestGetHashBytesFromFile;
  295. Var
  296. F,S : TStream;
  297. Fn,A : AnsiString;
  298. begin
  299. A:='abc';
  300. F:=nil;
  301. S:=TStringStream.Create(A);
  302. try
  303. FN:=GetTempFileName;
  304. F:=TFileStream.Create(FN,fmCreate);
  305. F.CopyFrom(S,0);
  306. FreeAndNil(F);
  307. AssertEquals('GetHashBytes',ExpectAbcMD5,THashMD5.GetHashBytesFromFile(FN));
  308. finally
  309. S.Free;
  310. FreeAndNil(F);
  311. end;
  312. end;
  313. procedure TTestMD5.TestGetHashStringFromFile;
  314. Var
  315. F,S : TStream;
  316. Fn,A : AnsiString;
  317. begin
  318. A:='abc';
  319. F:=nil;
  320. S:=TStringStream.Create(A);
  321. try
  322. FN:=GetTempFileName;
  323. F:=TFileStream.Create(FN,fmCreate);
  324. F.CopyFrom(S,0);
  325. FreeAndNil(F);
  326. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectABCMD5),THashMD5.GetHashStringFromFile(FN));
  327. finally
  328. S.Free;
  329. FreeAndNil(F);
  330. end;
  331. end;
  332. procedure TTestMD5.SetUp;
  333. begin
  334. FMD5:=THashMD5.Create;
  335. end;
  336. procedure TTestMD5.TearDown;
  337. begin
  338. //
  339. end;
  340. { TTestSha1 }
  341. procedure TTestSha1.SetUp;
  342. begin
  343. inherited SetUp;
  344. FSHA1:=THashSha1.Create;
  345. end;
  346. procedure TTestSha1.TearDown;
  347. begin
  348. inherited TearDown;
  349. end;
  350. procedure TTestSha1.TestHashAsBytes;
  351. var
  352. Act : TBytes;
  353. begin
  354. FSHA1.Update('abc');
  355. Act:=FSHA1.HashAsBytes;
  356. // Writeln(BytesToString(Act));
  357. AssertEquals('abc',ExpectAbcSha1,Act);
  358. end;
  359. procedure TTestSha1.TestHashAsBytesTwice;
  360. var
  361. Act : TBytes;
  362. begin
  363. FSHA1.Update('abc');
  364. Act:=FSHA1.HashAsBytes;
  365. // Writeln(BytesToString(Act));
  366. AssertEquals('abc',ExpectAbcSha1,Act);
  367. Act:=FSHA1.HashAsBytes;
  368. // Writeln(BytesToString(Act));
  369. AssertEquals('abc',ExpectAbcSha1,Act);
  370. end;
  371. procedure TTestSha1.TestGetHashBytesString;
  372. begin
  373. AssertEquals('abc',ExpectAbcSha1,THashSha1.GetHashBytes('abc'));
  374. end;
  375. procedure TTestSha1.TestGetHashStringString;
  376. begin
  377. AssertEquals('abc',THash.DigestAsString(ExpectAbcSha1),THashSha1.GetHashString('abc'));
  378. end;
  379. procedure TTestSha1.TestGetHashBytesStream;
  380. Var
  381. S : TStream;
  382. A : AnsiString;
  383. begin
  384. A:='abc';
  385. S:=TBytesStream.Create(TEncoding.UTF8.GetAnsiBytes(A));
  386. try
  387. AssertEquals('GetHashBytes',ExpectAbcSha1,THashSha1.GetHashBytes(S));
  388. finally
  389. S.Free;
  390. end;
  391. end;
  392. procedure TTestSha1.TestGetHashStringStream;
  393. Var
  394. S : TStream;
  395. A : AnsiString;
  396. begin
  397. A:='abc';
  398. S:=TStringStream.Create(A);
  399. try
  400. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectAbcSha1),THashSha1.GetHashString(S));
  401. finally
  402. S.Free;
  403. end;
  404. end;
  405. procedure TTestSha1.TestGetHashBytesFromFile;
  406. Var
  407. F,S : TStream;
  408. Fn,A : AnsiString;
  409. begin
  410. A:='abc';
  411. F:=nil;
  412. S:=TStringStream.Create(A);
  413. try
  414. FN:=GetTempFileName;
  415. F:=TFileStream.Create(FN,fmCreate);
  416. F.CopyFrom(S,0);
  417. FreeAndNil(F);
  418. AssertEquals('GetHashBytes',ExpectAbcSha1,THashSha1.GetHashBytesFromFile(FN));
  419. finally
  420. S.Free;
  421. FreeAndNil(F);
  422. end;
  423. end;
  424. procedure TTestSha1.TestGetHashStringFromFile;
  425. Var
  426. F,S : TStream;
  427. Fn,A : AnsiString;
  428. begin
  429. A:='abc';
  430. F:=nil;
  431. S:=TStringStream.Create(A);
  432. try
  433. FN:=GetTempFileName;
  434. F:=TFileStream.Create(FN,fmCreate);
  435. F.CopyFrom(S,0);
  436. FreeAndNil(F);
  437. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectABCSha1),THashSha1.GetHashStringFromFile(FN));
  438. finally
  439. S.Free;
  440. FreeAndNil(F);
  441. end;
  442. end;
  443. { TTestSha2 }
  444. procedure TTestSha2.SetUp;
  445. begin
  446. inherited SetUp;
  447. FSHa2:=THashSha2.Create();
  448. end;
  449. procedure TTestSha2.TearDown;
  450. begin
  451. FSHa2:=Default(THashSha2);
  452. inherited TearDown;
  453. end;
  454. procedure TTestSha2.TestHashAsBytes;
  455. var
  456. Act : TBytes;
  457. begin
  458. FSHA2.Update(UNicodeString('abc'));
  459. Act:=FSHA2.HashAsBytes;
  460. AssertEquals('abc',ExpectAbcSha2,Act);
  461. end;
  462. procedure TTestSha2.TestHashAsBytesTwice;
  463. var
  464. Act : TBytes;
  465. begin
  466. FSHA2.Update(UNicodeString('abc'));
  467. Act:=FSHA2.HashAsBytes;
  468. AssertEquals('abc',ExpectAbcSha2,Act);
  469. Act:=FSHA2.HashAsBytes;
  470. AssertEquals('abc',ExpectAbcSha2,Act);
  471. end;
  472. procedure TTestSha2.TestGetHashBytesString;
  473. begin
  474. AssertEquals('abc',ExpectAbcSha2,THashSha2.GetHashBytes('abc'));
  475. end;
  476. procedure TTestSha2.TestGetHashStringString;
  477. begin
  478. AssertEquals('abc',THash.DigestAsString(ExpectAbcSha2),THashSha2.GetHashString('abc'));
  479. end;
  480. procedure TTestSha2.TestGetHashBytesStream;
  481. Var
  482. S : TStream;
  483. A : AnsiString;
  484. begin
  485. A:='abc';
  486. S:=TBytesStream.Create(TEncoding.UTF8.GetAnsiBytes(A));
  487. try
  488. AssertEquals('GetHashBytes',ExpectAbcSha2,THashSha2.GetHashBytes(S));
  489. finally
  490. S.Free;
  491. end;
  492. end;
  493. procedure TTestSha2.TestGetHashStringStream;
  494. Var
  495. S : TStream;
  496. A : AnsiString;
  497. begin
  498. A:='abc';
  499. S:=TStringStream.Create(A);
  500. try
  501. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectAbcSha2),THashSha2.GetHashString(S));
  502. finally
  503. S.Free;
  504. end;
  505. end;
  506. procedure TTestSha2.TestGetHashBytesFromFile;
  507. Var
  508. F,S : TStream;
  509. Fn,A : AnsiString;
  510. begin
  511. A:='abc';
  512. F:=nil;
  513. S:=TStringStream.Create(A);
  514. try
  515. FN:=GetTempFileName;
  516. F:=TFileStream.Create(FN,fmCreate);
  517. F.CopyFrom(S,0);
  518. FreeAndNil(F);
  519. AssertEquals('GetHashBytes',ExpectAbcSha2,THashSha2.GetHashBytesFromFile(FN));
  520. finally
  521. S.Free;
  522. FreeAndNil(F);
  523. end;
  524. end;
  525. procedure TTestSha2.TestGetHashStringFromFile;
  526. Var
  527. F,S : TStream;
  528. Fn,A : AnsiString;
  529. begin
  530. A:='abc';
  531. F:=nil;
  532. S:=TStringStream.Create(A);
  533. try
  534. FN:=GetTempFileName;
  535. F:=TFileStream.Create(FN,fmCreate);
  536. F.CopyFrom(S,0);
  537. FreeAndNil(F);
  538. AssertEquals('GetHashBytes',THash.DigestAsString(ExpectABCSha2),THashSha2.GetHashStringFromFile(FN));
  539. finally
  540. S.Free;
  541. FreeAndNil(F);
  542. end;
  543. end;
  544. { TTestFNV }
  545. procedure TTestFNV.SetUp;
  546. begin
  547. inherited SetUp;
  548. FFNV:=THashFNV1a32.Create;
  549. end;
  550. procedure TTestFNV.TearDown;
  551. begin
  552. inherited TearDown;
  553. end;
  554. procedure TTestFNV.TestHashAsBytes;
  555. var
  556. Act : TBytes;
  557. begin
  558. // Writeln('HashAsBytes');
  559. FFNV.Update(RawByteString('abc'));
  560. Act:=FFNV.HashAsBytes;
  561. AssertEquals('abc',ExpectABCFNV,THash.DigestAsInteger(Act));
  562. end;
  563. procedure TTestFNV.TestGetHashBytes;
  564. var
  565. Act : TBytes;
  566. begin
  567. // Writeln('GetHashBytes');
  568. Act:=THashFNV1a32.GetHashBytes('abc');
  569. // Writeln(BytesToString(Act));
  570. AssertEquals('abc',ExpectABCFNVUnicode,Cardinal(THash.DigestAsInteger(Act)));
  571. end;
  572. procedure TTestFNV.TestGetHashStringUnicode;
  573. var
  574. A : Unicodestring;
  575. begin
  576. A:='abc';
  577. AssertEquals('Hash',HexStr(ExpectABCFNVUnicode,8),THashFNV1a32.GetHashString(A));
  578. end;
  579. procedure TTestFNV.TestGetHashStringRawByte;
  580. var
  581. A : Ansistring;
  582. begin
  583. A:='abc';
  584. AssertEquals('Hash',HexStr(ExpectABCFNV,8),THashFNV1a32.GetHashString(A));
  585. end;
  586. procedure TTestFNV.TestGetHashValueUnicode;
  587. var
  588. A : Unicodestring;
  589. begin
  590. A:='abc';
  591. AssertEquals('Hash',ExpectABCFNVUnicode,Cardinal(THashFNV1a32.GetHashValue(A)));
  592. end;
  593. procedure TTestFNV.TestGetHashValueRawByte;
  594. var
  595. A : Ansistring;
  596. begin
  597. A:='abc';
  598. AssertEquals('Hash',ExpectABCFNV,THashFNV1a32.GetHashValue(A));
  599. end;
  600. procedure TTestFNV.TestGetHashValue;
  601. var
  602. A : Ansistring;
  603. begin
  604. A:='abc';
  605. AssertEquals('Hash',ExpectABCFNV,THashFNV1a32.GetHashValue(PByte(A)^,3));
  606. end;
  607. { TTestBobJenkins }
  608. procedure TTestBobJenkins.SetUp;
  609. begin
  610. inherited SetUp;
  611. FBJ:=THashBobJenkins.Create;
  612. end;
  613. procedure TTestBobJenkins.TearDown;
  614. begin
  615. FBJ:=Default(THashBobJenkins);
  616. inherited TearDown;
  617. end;
  618. procedure TTestBobJenkins.TestHashAsBytes;
  619. var
  620. Act : TBytes;
  621. begin
  622. FBJ.Update(RawByteString('abc'));
  623. Act:=FBJ.HashAsBytes;
  624. AssertEquals('abc',ExpectABCBJ,THash.DigestAsInteger(Act));
  625. end;
  626. procedure TTestBobJenkins.TestGetHashBytes;
  627. var
  628. Act : TBytes;
  629. begin
  630. Act:=THashBobJenkins.GetHashBytes('abc');
  631. AssertEquals('abc',ExpectABCBJUnicode,Cardinal(THash.DigestAsInteger(Act)));
  632. end;
  633. procedure TTestBobJenkins.TestGetHashStringUnicode;
  634. var
  635. A : Unicodestring;
  636. begin
  637. A:='abc';
  638. AssertEquals('Hash',HexStr(ExpectABCBJUnicode,8),THashBobJenkins.GetHashString(A));
  639. end;
  640. procedure TTestBobJenkins.TestGetHashStringRawByte;
  641. var
  642. A : Ansistring;
  643. begin
  644. A:='abc';
  645. AssertEquals('Hash',HexStr(ExpectABCBJ,8),THashBobJenkins.GetHashString(A));
  646. end;
  647. procedure TTestBobJenkins.TestGetHashValueUnicode;
  648. var
  649. A : UnicodeString;
  650. D : Integer;
  651. begin
  652. A:='abc';
  653. D:=THashBobJenkins.GetHashValue(A);
  654. AssertEquals('abc',ExpectABCBJUnicode,Cardinal(D));
  655. end;
  656. procedure TTestBobJenkins.TestGetHashValueRawByte;
  657. var
  658. A : AnsiString;
  659. D : Integer;
  660. begin
  661. A:='abc';
  662. D:=Cardinal(THashBobJenkins.GetHashValue(A));
  663. AssertEquals('abc',ExpectABCBJ,D);
  664. end;
  665. procedure TTestBobJenkins.TestGetHashValue;
  666. var
  667. A : AnsiString;
  668. D : Integer;
  669. begin
  670. A:='abc';
  671. D:=Cardinal(THashBobJenkins.GetHashValue(PByte(A),3));
  672. AssertEquals('abc',ExpectABCBJ,D);
  673. end;
  674. initialization
  675. RegisterTests([TTestHash,TTestMD5,TTestSha1,TTestFNV,TTestBobJenkins,TTestSha2]);
  676. end.