暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

xxHash3Tests.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. using NUnit.Framework;
  2. using Unity.Burst;
  3. using Unity.Collections;
  4. using Unity.Collections.Tests;
  5. using Unity.Collections.LowLevel.Unsafe;
  6. using Unity.Jobs;
  7. using Unity.Mathematics;
  8. using Random = Unity.Mathematics.Random;
  9. [TestFixture]
  10. [BurstCompile]
  11. internal class xxHash3Tests : CollectionsTestCommonBase
  12. {
  13. private unsafe void* SanityBuffer;
  14. private unsafe void* DestinationBuffer;
  15. private const int SANITY_BUFFER_SIZE = 2367;
  16. [SetUp]
  17. public unsafe override void Setup()
  18. {
  19. base.Setup();
  20. unchecked
  21. {
  22. uint prime = 2654435761U;
  23. ulong prime64 = 11400714785074694797UL;
  24. ulong byteGen = prime;
  25. SanityBuffer = Memory.Unmanaged.Allocate(SANITY_BUFFER_SIZE, 64, Allocator.Persistent);
  26. byte* buffer = (byte*)SanityBuffer;
  27. DestinationBuffer = Memory.Unmanaged.Allocate(SANITY_BUFFER_SIZE, 64, Allocator.Persistent);
  28. int i;
  29. for (i=0; i<SANITY_BUFFER_SIZE; i++) {
  30. buffer[i] = (byte)(byteGen>>56);
  31. byteGen *= prime64;
  32. }
  33. }
  34. }
  35. [TearDown]
  36. public unsafe override void TearDown()
  37. {
  38. Memory.Unmanaged.Free(SanityBuffer, Allocator.Persistent);
  39. Memory.Unmanaged.Free(DestinationBuffer, Allocator.Persistent);
  40. base.TearDown();
  41. }
  42. [BurstCompile(CompileSynchronously = true)]
  43. struct xxHash3Hash64SanityCheckJob : IJob
  44. {
  45. [NativeDisableUnsafePtrRestriction]
  46. public unsafe void* SanityBuffer;
  47. [NativeDisableUnsafePtrRestriction]
  48. public unsafe void* DestinationBuffer;
  49. public long Length;
  50. public ulong Seed;
  51. public NativeArray<uint2> Result;
  52. public unsafe void Execute()
  53. {
  54. var resultIndex = 1;
  55. // Compute Hash from buffer
  56. Result[resultIndex++] = xxHash3.Hash64(SanityBuffer, Length, Seed);
  57. // Hash & copy and Streaming API is currently not supported with Hash64
  58. // // Compute/Copy (TODO API still not developed)
  59. // if (DestinationBuffer != null)
  60. // {
  61. // CopySingleCallHashResult = xxHash3.Hash64(SanityBuffer, DestinationBuffer, Length, Seed);
  62. // }
  63. // Streaming API Test
  64. {
  65. var state = new xxHash3.StreamingState(true, Seed);
  66. state.Update(SanityBuffer, (int)Length);
  67. Result[resultIndex++] = state.DigestHash64();
  68. }
  69. // 2 updates
  70. if (Length > 3)
  71. {
  72. var state = new xxHash3.StreamingState(true, Seed);
  73. {
  74. state.Update(SanityBuffer, 3);
  75. state.Update((byte*)SanityBuffer+3, (int)Length-3);
  76. Result[resultIndex++] = state.DigestHash64();
  77. }
  78. }
  79. // byte per byte update
  80. if (Length > 0) {
  81. var state = new xxHash3.StreamingState(true, Seed);
  82. {
  83. var bBuffer = (byte*) SanityBuffer;
  84. for (int i = 0; i < Length; i++)
  85. {
  86. state.Update(bBuffer + i, 1);
  87. }
  88. Result[resultIndex++] = state.DigestHash64();
  89. }
  90. }
  91. Result[0] = new uint2(resultIndex - 1);
  92. }
  93. }
  94. const ulong Prime = 2654435761U;
  95. const ulong Prime64 = 11400714785074694797UL;
  96. private unsafe void TestHash64(long length, ulong seed, ulong result, ulong resultWithSeed)
  97. {
  98. var job = new xxHash3Hash64SanityCheckJob
  99. {
  100. SanityBuffer = SanityBuffer,
  101. DestinationBuffer = DestinationBuffer,
  102. Result = CollectionHelper.CreateNativeArray<uint2>(10, CommonRwdAllocator.Handle),
  103. Seed = 0,
  104. Length = length
  105. };
  106. var b = xxHash3.ToUint2(result);
  107. job.Schedule().Complete();
  108. var resultCount = job.Result[0].x;
  109. for (int i = 0; i < resultCount; i++)
  110. {
  111. var a = job.Result[i+1];
  112. Assert.That(a, Is.EqualTo(b), $"Failed on entry {i}");
  113. }
  114. job.Seed = seed;
  115. job.Schedule().Complete();
  116. b = xxHash3.ToUint2(resultWithSeed);
  117. resultCount = job.Result[0].x;
  118. for (int i = 0; i < resultCount; i++)
  119. {
  120. Assert.That(job.Result[i+1], Is.EqualTo(b), $"Failed on entry {i}");
  121. }
  122. job.Result.Dispose();
  123. }
  124. [Test]
  125. public void xxHash3_Hash_64_Length0000()
  126. {
  127. TestHash64(0, Prime64, 0x2D06800538D394C2UL, 0xA8A6B918B2F0364AUL);
  128. }
  129. [Test]
  130. public void xxHash3_Hash_64_Length0001()
  131. {
  132. TestHash64(1, Prime64, 0xC44BDFF4074EECDBUL, 0x032BE332DD766EF8UL);
  133. }
  134. [Test]
  135. public void xxHash3_Hash_64_Length0006()
  136. {
  137. TestHash64(6, Prime64, 0x27B56A84CD2D7325UL, 0x84589C116AB59AB9UL);
  138. }
  139. [Test]
  140. public void xxHash3_Hash_64_Length0012()
  141. {
  142. TestHash64(12, Prime64, 0xA713DAF0DFBB77E7UL, 0xE7303E1B2336DE0EUL);
  143. }
  144. [Test]
  145. public void xxHash3_Hash_64_Length0024()
  146. {
  147. TestHash64(24, Prime64, 0xA3FE70BF9D3510EBUL, 0x850E80FC35BDD690UL);
  148. }
  149. [Test]
  150. public void xxHash3_Hash_64_Length0048()
  151. {
  152. TestHash64(48, Prime64, 0x397DA259ECBA1F11UL, 0xADC2CBAA44ACC616UL);
  153. }
  154. [Test]
  155. public void xxHash3_Hash_64_Length0080()
  156. {
  157. TestHash64(80, Prime64, 0xBCDEFBBB2C47C90AUL, 0xC6DD0CB699532E73UL);
  158. }
  159. [Test]
  160. public void xxHash3_Hash_64_Length0195()
  161. {
  162. TestHash64(195, Prime64, 0xCD94217EE362EC3AUL, 0xBA68003D370CB3D9UL);
  163. }
  164. [Test]
  165. public void xxHash3_Hash_64_Length0403()
  166. {
  167. TestHash64(403, Prime64, 0xCDEB804D65C6DEA4UL, 0x6259F6ECFD6443FDUL);
  168. }
  169. [Test]
  170. public void xxHash3_Hash_64_Length0512()
  171. {
  172. TestHash64(512, Prime64, 0x617E49599013CB6BUL, 0x3CE457DE14C27708UL);
  173. }
  174. [Test]
  175. public void xxHash3_Hash_64_Length2048()
  176. {
  177. TestHash64(2048, Prime64, 0xDD59E2C3A5F038E0UL, 0x66F81670669ABABCUL);
  178. }
  179. [Test]
  180. public void xxHash3_Hash_64_Length2240()
  181. {
  182. TestHash64(2240, Prime64, 0x6E73A90539CF2948UL, 0x757BA8487D1B5247UL);
  183. }
  184. [Test]
  185. public void xxHash3_Hash_64_Length2243()
  186. {
  187. TestHash64(2367, Prime64, 0xCB37AEB9E5D361EDUL, 0xD2DB3415B942B42AUL);
  188. }
  189. [BurstCompile(CompileSynchronously = true)]
  190. struct xxHash3Hash128SanityCheckJob : IJob
  191. {
  192. [NativeDisableUnsafePtrRestriction]
  193. public unsafe void* SanityBuffer;
  194. [NativeDisableUnsafePtrRestriction]
  195. public unsafe void* DestinationBuffer;
  196. public long Length;
  197. public ulong Seed;
  198. public NativeArray<uint4> Result;
  199. public unsafe void Execute()
  200. {
  201. var resultIndex = 1;
  202. // Compute Hash from buffer
  203. Result[resultIndex++] = xxHash3.Hash128(SanityBuffer, Length, Seed);
  204. // Compute/Copy
  205. if (DestinationBuffer != null)
  206. {
  207. Result[resultIndex++] = xxHash3.Hash128(SanityBuffer, DestinationBuffer, Length, Seed);
  208. }
  209. // Streaming API Test
  210. {
  211. var state = new xxHash3.StreamingState(false, Seed);
  212. state.Update(SanityBuffer, (int)Length);
  213. Result[resultIndex++] = state.DigestHash128();
  214. }
  215. // 2 updates
  216. if (Length > 3)
  217. {
  218. var state = new xxHash3.StreamingState(false, Seed);
  219. {
  220. state.Update(SanityBuffer, 3);
  221. state.Update((byte*)SanityBuffer+3, (int)Length-3);
  222. Result[resultIndex++] = state.DigestHash128();
  223. }
  224. }
  225. // byte per byte update
  226. if (Length > 0) {
  227. var state = new xxHash3.StreamingState(false, Seed);
  228. {
  229. var bBuffer = (byte*) SanityBuffer;
  230. for (int i = 0; i < Length; i++)
  231. {
  232. state.Update(bBuffer + i, 1);
  233. }
  234. Result[resultIndex++] = state.DigestHash128();
  235. }
  236. }
  237. Result[0] = new uint4(resultIndex - 1);
  238. }
  239. }
  240. private unsafe void TestHash128(long length, ulong seed, uint4 result, uint4 resultWithSeed)
  241. {
  242. var job = new xxHash3Hash128SanityCheckJob
  243. {
  244. SanityBuffer = SanityBuffer,
  245. DestinationBuffer = DestinationBuffer,
  246. Result = CollectionHelper.CreateNativeArray<uint4>(10, CommonRwdAllocator.Handle),
  247. Seed = 0,
  248. Length = length
  249. };
  250. job.Schedule().Complete();
  251. var resultCount = (int)job.Result[0].x;
  252. for (int i = 0; i < resultCount; i++)
  253. {
  254. Assert.That(job.Result[i+1], Is.EqualTo(result), $"Failed on entry {i}");
  255. }
  256. job.Seed = seed;
  257. job.Schedule().Complete();
  258. resultCount = (int)job.Result[0].x;
  259. for (int i = 0; i < resultCount; i++)
  260. {
  261. Assert.That(job.Result[i+1], Is.EqualTo(resultWithSeed), $"Failed on entry {i}");
  262. }
  263. job.Result.Dispose();
  264. }
  265. [Test]
  266. public unsafe void xxHash3_Hash_128_Length0000()
  267. {
  268. TestHash128(0, Prime,
  269. xxHash3.ToUint4(0x6001C324468D497FUL, 0x99AA06D3014798D8UL),
  270. xxHash3.ToUint4(0x5444F7869C671AB0UL, 0x92220AE55E14AB50UL));
  271. }
  272. [Test]
  273. public void xxHash3_Hash_128_Length0001()
  274. {
  275. TestHash128(1, Prime,
  276. xxHash3.ToUint4(0xC44BDFF4074EECDBUL, 0xA6CD5E9392000F6AUL),
  277. xxHash3.ToUint4(0xB53D5557E7F76F8DUL, 0x89B99554BA22467CUL));
  278. }
  279. [Test]
  280. public void xxHash3_Hash_128_Length0006()
  281. {
  282. // Length 6
  283. TestHash128(6, Prime,
  284. xxHash3.ToUint4(0x3E7039BDDA43CFC6UL, 0x082AFE0B8162D12AUL),
  285. xxHash3.ToUint4(0x269D8F70BE98856EUL, 0x5A865B5389ABD2B1UL));
  286. }
  287. [Test]
  288. public void xxHash3_Hash_128_Length0012()
  289. {
  290. // Length 12
  291. TestHash128(12, Prime,
  292. xxHash3.ToUint4(0x061A192713F69AD9UL, 0x6E3EFD8FC7802B18UL),
  293. xxHash3.ToUint4(0x9BE9F9A67F3C7DFBUL, 0xD7E09D518A3405D3UL));
  294. }
  295. [Test]
  296. public void xxHash3_Hash_128_Length0024()
  297. {
  298. // Length 24
  299. TestHash128(24, Prime,
  300. xxHash3.ToUint4(0x1E7044D28B1B901DUL, 0x0CE966E4678D3761UL),
  301. xxHash3.ToUint4(0xD7304C54EBAD40A9UL, 0x3162026714A6A243UL));
  302. }
  303. [Test]
  304. public void xxHash3_Hash_128_Length0048()
  305. {
  306. // Length 48
  307. TestHash128(48, Prime,
  308. xxHash3.ToUint4(0xF942219AED80F67BUL, 0xA002AC4E5478227EUL),
  309. xxHash3.ToUint4(0x7BA3C3E453A1934EUL, 0x163ADDE36C072295UL));
  310. }
  311. [Test]
  312. public void xxHash3_Hash_128_Length0081()
  313. {
  314. // Length 81
  315. TestHash128(81, Prime,
  316. xxHash3.ToUint4(0x5E8BAFB9F95FB803UL, 0x4952F58181AB0042UL),
  317. xxHash3.ToUint4(0x703FBB3D7A5F755CUL, 0x2724EC7ADC750FB6UL));
  318. }
  319. [Test]
  320. public void xxHash3_Hash_128_Length0222()
  321. {
  322. // Length 222
  323. TestHash128(222, Prime,
  324. xxHash3.ToUint4(0xF1AEBD597CEC6B3AUL, 0x337E09641B948717UL),
  325. xxHash3.ToUint4(0xAE995BB8AF917A8DUL, 0x91820016621E97F1UL));
  326. }
  327. [Test]
  328. public void xxHash3_Hash_128_Length0403()
  329. {
  330. // Length 403
  331. TestHash128(403, Prime64,
  332. xxHash3.ToUint4(0xCDEB804D65C6DEA4UL, 0x1B6DE21E332DD73DUL),
  333. xxHash3.ToUint4(0x6259F6ECFD6443FDUL, 0xBED311971E0BE8F2UL));
  334. }
  335. [Test]
  336. public void xxHash3_Hash_128_Length0512()
  337. {
  338. // Length 512
  339. TestHash128(512, Prime64,
  340. xxHash3.ToUint4(0x617E49599013CB6BUL, 0x18D2D110DCC9BCA1UL),
  341. xxHash3.ToUint4(0x3CE457DE14C27708UL, 0x925D06B8EC5B8040UL));
  342. }
  343. [Test]
  344. public void xxHash3_Hash_128_Length2048()
  345. {
  346. // Length 2048
  347. TestHash128(2048, Prime,
  348. xxHash3.ToUint4(0xDD59E2C3A5F038E0UL, 0xF736557FD47073A5UL),
  349. xxHash3.ToUint4(0x230D43F30206260BUL, 0x7FB03F7E7186C3EAUL));
  350. }
  351. [Test]
  352. public void xxHash3_Hash_128_Length2240()
  353. {
  354. // Length 2240
  355. TestHash128(2240, Prime,
  356. xxHash3.ToUint4(0x6E73A90539CF2948UL, 0xCCB134FBFA7CE49DUL),
  357. xxHash3.ToUint4(0xED385111126FBA6FUL, 0x50A1FE17B338995FUL));
  358. }
  359. [Test]
  360. public void xxHash3_Hash_128_Length2367()
  361. {
  362. // Length 2367
  363. TestHash128(2367, Prime,
  364. xxHash3.ToUint4(0xCB37AEB9E5D361EDUL, 0xE89C0F6FF369B427UL),
  365. xxHash3.ToUint4(0x6F5360AE69C2F406UL, 0xD23AAE4B76C31ECBUL));
  366. }
  367. }