From 3aea85411f61e8890b34e1de5fd348a4bcc85552 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 15 Jul 2026 17:11:28 -0700 Subject: [PATCH] test: add SipHash-1-3-UJ coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add SipHash-1-3-UJ outputs to the shared vectors for sequences of 8- and 32-byte blocks. Check generic writes and applicable fixed-width `Hash` overloads against those outputs, and fuzz their equivalence including mixed normal/jumbo encodings. The outputs were generated by an independent implementation that Claude Opus 4.8 produced using only the `SipHasher13UJ` class comment as its prompt. Co-authored-by: Lőrinc --- src/test/data/siphash.json | 128 ++++++++++++++++++------------------- src/test/fuzz/integer.cpp | 32 ++++++++++ src/test/hash_tests.cpp | 35 ++++++++++ 3 files changed, 131 insertions(+), 64 deletions(-) diff --git a/src/test/data/siphash.json b/src/test/data/siphash.json index 6ea340096a6..19b4aaadd4a 100644 --- a/src/test/data/siphash.json +++ b/src/test/data/siphash.json @@ -2,272 +2,272 @@ { "key": ["0000000000000000", "0000000000000000"], "input": [], - "expected": {"siphash24": "1e924b9d737700d7"} + "expected": {"siphash24": "1e924b9d737700d7", "siphash13uj": "74fdd8982aa99156"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": [], - "expected": {"siphash24": "726fdb47dd0e0e31"} + "expected": {"siphash24": "726fdb47dd0e0e31", "siphash13uj": "feee657d7e331ac3"} }, { "key": ["ffffffffffffffff", "ffffffffffffffff"], "input": [], - "expected": {"siphash24": "35dd279ee86ce565"} + "expected": {"siphash24": "35dd279ee86ce565", "siphash13uj": "b2203b65f6fc20f2"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000000"], - "expected": {"siphash24": "39d3851ca07681a7"} + "expected": {"siphash24": "39d3851ca07681a7", "siphash13uj": "6a74cba00ddbfeba"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["ffffffffffffffff"], - "expected": {"siphash24": "2a68ff30a3d9da34"} + "expected": {"siphash24": "2a68ff30a3d9da34", "siphash13uj": "a49b16683645df11"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0001020304050607"], - "expected": {"siphash24": "93f5f5799a932462"} + "expected": {"siphash24": "93f5f5799a932462", "siphash13uj": "636d75a66b0b2dee"} }, { "key": ["0000000000000000", "0000000000000000"], "input": ["0000000000000000"], - "expected": {"siphash24": "e849e8bb6ffe2567"} + "expected": {"siphash24": "e849e8bb6ffe2567", "siphash13uj": "44ba508bb47f860a"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000000000000000000000000000000000000000000000000000000"], - "expected": {"siphash24": "8990d3e4299496f4"} + "expected": {"siphash24": "8990d3e4299496f4", "siphash13uj": "6a74cba00ddbfeba"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"], - "expected": {"siphash24": "e1041d47f898e431"} + "expected": {"siphash24": "e1041d47f898e431", "siphash13uj": "7f745a471ec7c2f6"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"], - "expected": {"siphash24": "7127512f72f27cce"} + "expected": {"siphash24": "7127512f72f27cce", "siphash13uj": "c67d87b08ca4b5c6"} }, { "key": ["0000000000000000", "0000000000000000"], "input": ["0000000000000000000000000000000000000000000000000000000000000000"], - "expected": {"siphash24": "6c37e103dfa2827d"} + "expected": {"siphash24": "6c37e103dfa2827d", "siphash13uj": "44ba508bb47f860a"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["1011121314151617"], - "expected": {"siphash24": "76b71a8cb872b528"} + "expected": {"siphash24": "76b71a8cb872b528", "siphash13uj": "17bd848a0ddd6294"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["1011121314151617000000000000000000000000000000000000000000000000"], - "expected": {"siphash24": "070fb8d2b4264e7e"} + "expected": {"siphash24": "070fb8d2b4264e7e", "siphash13uj": "17bd848a0ddd6294"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0102030405060708", "0203040506070809", "030405060708090a"], - "expected": {"siphash24": "9b3c1cee5de9caa4"} + "expected": {"siphash24": "9b3c1cee5de9caa4", "siphash13uj": "46b8c5978195f0d0"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0102030405060708000000000000000000000000000000000000000000000000", "0203040506070809000000000000000000000000000000000000000000000000", "030405060708090a000000000000000000000000000000000000000000000000"], - "expected": {"siphash24": "e9277fda84de2f84"} + "expected": {"siphash24": "e9277fda84de2f84", "siphash13uj": "46b8c5978195f0d0"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f"], - "expected": {"siphash24": "27bd5ecb84e56c87"} + "expected": {"siphash24": "27bd5ecb84e56c87", "siphash13uj": "d2c0b9ab84599147"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["4041424344454647", "48494a4b4c4d4e4f", "5051525354555657", "58595a5b5c5d5e5f"], - "expected": {"siphash24": "27bd5ecb84e56c87"} + "expected": {"siphash24": "27bd5ecb84e56c87", "siphash13uj": "d630244e335448dd"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0001020304050607", "08090a0b0c0d0e0f"], - "expected": {"siphash24": "3f2acc7f57c29bdb"} + "expected": {"siphash24": "3f2acc7f57c29bdb", "siphash13uj": "7c25d372353b5aa1"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0001020304050607", "08090a0b0c0d0e0f", "1011121314151617", "18191a1b1c1d1e1f"], - "expected": {"siphash24": "7127512f72f27cce"} + "expected": {"siphash24": "7127512f72f27cce", "siphash13uj": "1aba99b7cf175f4a"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0001020304050607", "08090a0b0c0d0e0f", "1011121314151617", "18191a1b1c1d1e1f", "2021222324252627", "28292a2b2c2d2e2f", "3031323334353637", "38393a3b3c3d3e3f"], - "expected": {"siphash24": "acd2c40b8502cad8"} + "expected": {"siphash24": "acd2c40b8502cad8", "siphash13uj": "ba4cdea787bdabb9"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000", "0000000000000000"], - "expected": {"siphash24": "d6d266a868d1e17c"} + "expected": {"siphash24": "d6d266a868d1e17c", "siphash13uj": "b40ca9149482127a"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"], - "expected": {"siphash24": "acd2c40b8502cad8"} + "expected": {"siphash24": "acd2c40b8502cad8", "siphash13uj": "6bd1d4ec2ccd0192"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"], - "expected": {"siphash24": "deb79e256c8736ae"} + "expected": {"siphash24": "deb79e256c8736ae", "siphash13uj": "497a4c5f66a6c9ac"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f", "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", "a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf", "c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf", "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"], - "expected": {"siphash24": "999d0526d2a7bfd7"} + "expected": {"siphash24": "999d0526d2a7bfd7", "siphash13uj": "33f9f36a0690842d"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["1112131415161718", "22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041"], - "expected": {"siphash24": "2a8b45c236d6964c"} + "expected": {"siphash24": "2a8b45c236d6964c", "siphash13uj": "2e989a98fc8ab941"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041", "1112131415161718"], - "expected": {"siphash24": "2086c12dd61e796a"} + "expected": {"siphash24": "2086c12dd61e796a", "siphash13uj": "6f62e14ce40a8928"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["a0a1a2a3a4a5a6a7", "b0b1b2b3b4b5b6b7"], - "expected": {"siphash24": "103eacf2c5a3c798"} + "expected": {"siphash24": "103eacf2c5a3c798", "siphash13uj": "3d50654ce19fef0a"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["b0b1b2b3b4b5b6b7", "a0a1a2a3a4a5a6a7"], - "expected": {"siphash24": "16098ab961ca74be"} + "expected": {"siphash24": "16098ab961ca74be", "siphash13uj": "93d52229e1bf3f12"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0102030405060708", "02030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021", "030405060708090a"], - "expected": {"siphash24": "f33f8a1ac89a38a5"} + "expected": {"siphash24": "f33f8a1ac89a38a5", "siphash13uj": "93d4844f68473bde"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20", "0203040506070809", "030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122"], - "expected": {"siphash24": "83a7e7cb48fcc3f0"} + "expected": {"siphash24": "83a7e7cb48fcc3f0", "siphash13uj": "1eeb5627f80ec45e"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0101010101010101", "0202020202020202", "0303030303030303030303030303030303030303030303030303030303030303", "0404040404040404040404040404040404040404040404040404040404040404", "0505050505050505"], - "expected": {"siphash24": "2da632417cf98266"} + "expected": {"siphash24": "2da632417cf98266", "siphash13uj": "36c183e8c31960ca"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0001020304050607", "08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627", "28292a2b2c2d2e2f", "303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f", "5051525354555657", "58595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374757677"], - "expected": {"siphash24": "9fee744ff1c22fcc"} + "expected": {"siphash24": "9fee744ff1c22fcc", "siphash13uj": "0373fa0d4680e12a"} }, { "key": ["0000000000000000", "0000000000000000"], "input": ["3031323334353637", "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f"], - "expected": {"siphash24": "f4b057ed3852ca9c"} + "expected": {"siphash24": "f4b057ed3852ca9c", "siphash13uj": "0ca784307a2b3941"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["3031323334353637", "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f"], - "expected": {"siphash24": "b0ecaab557894381"} + "expected": {"siphash24": "b0ecaab557894381", "siphash13uj": "40a0e330ade3b826"} }, { "key": ["ffffffffffffffff", "ffffffffffffffff"], "input": ["3031323334353637", "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f"], - "expected": {"siphash24": "c31e72088331c72c"} + "expected": {"siphash24": "c31e72088331c72c", "siphash13uj": "39b802d0fb124208"} }, { "key": ["0123456789abcdef", "0000000000000000"], "input": ["3031323334353637", "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f"], - "expected": {"siphash24": "f74571f90abc512c"} + "expected": {"siphash24": "f74571f90abc512c", "siphash13uj": "21bd1ab2c8db2044"} }, { "key": ["0000000000000000", "0123456789abcdef"], "input": ["3031323334353637", "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f"], - "expected": {"siphash24": "4b58713a5c1de640"} + "expected": {"siphash24": "4b58713a5c1de640", "siphash13uj": "bc66d61864912a68"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0100000000000000"], - "expected": {"siphash24": "2b91b2b085e6d1f6"} + "expected": {"siphash24": "2b91b2b085e6d1f6", "siphash13uj": "7426afff81e13e5d"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000080"], - "expected": {"siphash24": "45f93120d11c42c2"} + "expected": {"siphash24": "45f93120d11c42c2", "siphash13uj": "dbd8592fe9fd3b1b"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000000000000000000000000000000000000000000000000000080"], - "expected": {"siphash24": "52de95ec1fc46cf4"} + "expected": {"siphash24": "52de95ec1fc46cf4", "siphash13uj": "c946b5eafdebf91d"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0100000000000000010000000000000001000000000000000100000000000000"], - "expected": {"siphash24": "256fc49da00e8ae9"} + "expected": {"siphash24": "256fc49da00e8ae9", "siphash13uj": "28193aab7f7f53b5"} }, { "key": ["3becfe231ec833e1", "e5fe84a1124e5b76"], "input": ["5d6fae7bea1143a44b6a307d8dd3a8d5946d1b50943a0a4edb5390d7f41c6e29", "d22ee74ea5bb4d8d", "8032bbb059b1b9ef", "ec2ae4550dad3c60"], - "expected": {"siphash24": "2f57b02b4a7cf7d6"} + "expected": {"siphash24": "2f57b02b4a7cf7d6", "siphash13uj": "8f201c9a3e7ca92a"} }, { "key": ["cff49392d5b0aefe", "b8a0d7022086fc70"], "input": [], - "expected": {"siphash24": "9c7123b7b45d0895"} + "expected": {"siphash24": "9c7123b7b45d0895", "siphash13uj": "25f929e44740ac55"} }, { "key": ["9bf012bb0d65f966", "f15a2c8514da1d9d"], "input": [], - "expected": {"siphash24": "a5c78c807512368a"} + "expected": {"siphash24": "a5c78c807512368a", "siphash13uj": "e317bf983b4cf183"} }, { "key": ["4ac23ef0d1555a54", "4a498a3964dd2bc1"], "input": ["3e83c8e8b335d732", "539aea9c7872ae8f", "6f14ac803d3a9181"], - "expected": {"siphash24": "be7ea59e0e60a59d"} + "expected": {"siphash24": "be7ea59e0e60a59d", "siphash13uj": "3adb5b8275ff1694"} }, { "key": ["eef84fb309e552b9", "e60195c78faa2ee8"], "input": [], - "expected": {"siphash24": "001e0c1c4140f9ec"} + "expected": {"siphash24": "001e0c1c4140f9ec", "siphash13uj": "2bdc46f9f5e83bdc"} }, { "key": ["ecfdd5a1ea62a991", "6448b8f842081342"], "input": ["6d72f7bce2f0f751", "e277849660a8af7f"], - "expected": {"siphash24": "3bc824e8141dcdd9"} + "expected": {"siphash24": "3bc824e8141dcdd9", "siphash13uj": "89510c79ae874736"} }, { "key": ["ab7a12b9c8774c7d", "38056b7041eb2098"], "input": ["feebaa5f18a92c7e", "192679c9e82e3aa7"], - "expected": {"siphash24": "783219f01bb9d829"} + "expected": {"siphash24": "783219f01bb9d829", "siphash13uj": "a7cb7379701c754e"} }, { "key": ["13551d7a6089e83e", "ec3f8c0f4cbc1f7c"], "input": ["7a0704789365d997", "4bb21a07f4b75d0208d5d4638edcc438c9f8ffcc78e2106a0637c629f81ffbdb", "a7d8197a04173065ec896b73a6803d6113201c56fd643b241200b7ea357e6efd", "0202e1ebcf15e1a8", "316c96f5464fa473", "0700f913bbe4dad357c5db1b7e79abd29e6e590e842141a16cb6e97e6933206c"], - "expected": {"siphash24": "30cca0cb21a31ffe"} + "expected": {"siphash24": "30cca0cb21a31ffe", "siphash13uj": "638ab9733accc61a"} }, { "key": ["0000000000000000", "0000000000000000"], "input": ["101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f"], - "expected": {"siphash24": "1ca45bed0c8a9300"} + "expected": {"siphash24": "1ca45bed0c8a9300", "siphash13uj": "071384882b8b1ef6"} }, { "key": ["ffffffffffffffff", "ffffffffffffffff"], "input": ["101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f"], - "expected": {"siphash24": "acb2f25002d4ece5"} + "expected": {"siphash24": "acb2f25002d4ece5", "siphash13uj": "6d3cb0c74116cdd5"} }, { "key": ["25fd75c04a240044", "4e3816151d29e2ce"], "input": ["8940d79240a5bf8acdf428eece829dc27d8cc2ff7b74aaeb134f66062192d308"], - "expected": {"siphash24": "135eaef5f79941ad"} + "expected": {"siphash24": "135eaef5f79941ad", "siphash13uj": "16823b5389538dba"} }, { "key": ["aea4345a0fc4e761", "49456a8e8d82e5ee"], "input": ["6e0e507f21292ad46a49aa0b20efec23000474f6203f5ceaf4f9325c4e032bbe"], - "expected": {"siphash24": "56e57b1e7d81c846"} + "expected": {"siphash24": "56e57b1e7d81c846", "siphash13uj": "36ae52fdbe166c9a"} }, { "key": ["f7ce16edcfe54eeb", "81c22c4aed3e516d"], "input": ["caf32c2d8d827c8e55ee92253cffc657359af1cab7f24804afabac89a436fc75"], - "expected": {"siphash24": "84cad9f91acd36d0"} + "expected": {"siphash24": "84cad9f91acd36d0", "siphash13uj": "d8ebd74386d41628"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], @@ -327,52 +327,52 @@ { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000"], - "expected": {"siphash24": "9aef4ef6217cbc9b"} + "expected": {"siphash24": "9aef4ef6217cbc9b", "siphash13uj": "71c3a354a6b56058"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffff"], - "expected": {"siphash24": "ccf329a45ab38059"} + "expected": {"siphash24": "ccf329a45ab38059", "siphash13uj": "958c1a52a5e57e8b"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "4041424344454647"], - "expected": {"siphash24": "50a2be7f0f871937"} + "expected": {"siphash24": "50a2be7f0f871937", "siphash13uj": "6cfc788446f0491d"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["0100000000000000000000000000000000000000000000000000000000000000", "0000000000000080"], - "expected": {"siphash24": "5c7d5fcb5ea2a305"} + "expected": {"siphash24": "5c7d5fcb5ea2a305", "siphash13uj": "9e89e2fc7abb2ba2"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f", "2021222324252627"], - "expected": {"siphash24": "ac705932e98104a4"} + "expected": {"siphash24": "ac705932e98104a4", "siphash13uj": "cdcd25f7a2ba32c5"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], "input": ["101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f", "2122232425262728"], - "expected": {"siphash24": "7cbaa4ae7acddb81"} + "expected": {"siphash24": "7cbaa4ae7acddb81", "siphash13uj": "738d1f7d2d53622b"} }, { "key": ["0000000000000000", "0000000000000000"], "input": ["101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f", "2021222324252627"], - "expected": {"siphash24": "22cfffe8bffea59f"} + "expected": {"siphash24": "22cfffe8bffea59f", "siphash13uj": "0f078522df1349f3"} }, { "key": ["49b001bc5a213d62", "80a330a42e60a89d"], "input": ["6f7438d2dd360dcea691dd40e87426f4af6870315898ccbde0d3b19fcbb5ae6d", "55c36c12f25fffc9"], - "expected": {"siphash24": "9a5250a51a9eebfb"} + "expected": {"siphash24": "9a5250a51a9eebfb", "siphash13uj": "da1c5bf6cf31653d"} }, { "key": ["f4d704fa00ce074d", "6f1a65f3fe494b0a"], "input": ["175202cb9f976ebd6c4ddc4a80d63b2b53e2976466041ae43b41397c41fe66ac", "803a01720ad0c5a9"], - "expected": {"siphash24": "70552fcc39899ae4"} + "expected": {"siphash24": "70552fcc39899ae4", "siphash13uj": "5725ddc762049274"} }, { "key": ["c3f929b4cb53785c", "1693fa676a8ee165"], "input": ["2ac097c589bc75eb6e294605cafb3198891ff93764032225756aab86de06514b", "5c642eedd61df985"], - "expected": {"siphash24": "7b87d628efb69dd7"} + "expected": {"siphash24": "7b87d628efb69dd7", "siphash13uj": "49b121224ea53698"} }, { "key": ["0706050403020100", "0f0e0d0c0b0a0908"], diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp index beaec6f73dd..357b84e531c 100644 --- a/src/test/fuzz/integer.cpp +++ b/src/test/fuzz/integer.cpp @@ -129,6 +129,38 @@ FUZZ_TARGET(integer, .init = initialize_integer) hasher.Write(extra); assert(presalted_hasher(u256, u32) == hasher.Finalize()); } + { + const uint64_t data0{u160.GetUint64(0)}, data1{u160.GetUint64(1)}; + SipHasher13UJ hasher{u64, u64_2}; + const SipHasher13UJ fixed_hasher{u64, u64_2}; + hasher.WriteJumbo(u256); + assert(fixed_hasher.Hash(u256) == hasher.Finalize()); + hasher.Write(data0); + assert(fixed_hasher.Hash(u256, data0) == hasher.Finalize()); + + SipHasher13UJ reference{u64, u64_2}; + SipHasher13UJ mixed{u64, u64_2}; + reference.WriteJumbo(u256); + mixed.WriteJumbo(u256); + + const auto write_normal{[](SipHasher13UJ& hasher, uint64_t data, bool as_jumbo) { + if (as_jumbo) { + uint256 data256{}; + WriteLE64(data256.data(), data); + hasher.WriteJumbo(data256); + } else { + hasher.Write(data); + } + }}; + + reference.Write(data0).Write(data1); + write_normal(mixed, data0, b); + write_normal(mixed, data1, u8 & 1); + assert(mixed.Finalize() == reference.Finalize()); + + reference.WriteJumbo(u256).Write(data0); + assert(mixed.Hash(u256, data0) == reference.Finalize()); + } (void)ToLower(ch); (void)ToUpper(ch); { diff --git a/src/test/hash_tests.cpp b/src/test/hash_tests.cpp index 1b5419390a4..63ef4f5e547 100644 --- a/src/test/hash_tests.cpp +++ b/src/test/hash_tests.cpp @@ -30,6 +30,29 @@ static uint64_t CalculateSipHash24(const UniValue& input, uint64_t k0, uint64_t return result; } +static uint64_t CalculateSipHash13UJ(const UniValue& input, uint64_t k0, uint64_t k1, bool normal_as_jumbo) +{ + SipHasher13UJ hasher{k0, k1}; + for (auto& value : input.getValues()) { + const auto block{ParseHex(value.get_str())}; + if (block.size() == sizeof(uint64_t)) { + if (!normal_as_jumbo) { + hasher.Write(ReadLE64(block.data())); + } else { + uint256 data256{}; + WriteLE64(data256.data(), ReadLE64(block.data())); + hasher.WriteJumbo(data256); + } + } else { + BOOST_REQUIRE_EQUAL(block.size(), uint256::size()); + hasher.WriteJumbo(uint256{block}); + } + } + const uint64_t result{hasher.Finalize()}; + BOOST_CHECK_EQUAL(hasher.Finalize(), result); + return result; +} + BOOST_AUTO_TEST_CASE(murmurhash3) { @@ -162,6 +185,18 @@ BOOST_AUTO_TEST_CASE(siphash_test_vectors) const auto extra{ParseHex(input[1].get_str())}; BOOST_CHECK_EQUAL(PresaltedSipHasher(k0, k1)(FromHex256(input[0]), ReadLE32(extra.data())), expected24); } + if (auto& expected_value{test["expected"]["siphash13uj"]}; !expected_value.isNull()) { + const uint64_t expected13uj{FromHex64(expected_value)}; + BOOST_CHECK_EQUAL(CalculateSipHash13UJ(input, k0, k1, /*normal_as_jumbo=*/false), expected13uj); + BOOST_CHECK_EQUAL(CalculateSipHash13UJ(input, k0, k1, /*normal_as_jumbo=*/true), expected13uj); + const SipHasher13UJ fixed_hasher{k0, k1}; + if (hash_only) { + BOOST_CHECK_EQUAL(fixed_hasher.Hash(FromHex256(input[0])), expected13uj); + } else if (hash_extra && HasByteLength(input[1], sizeof(uint64_t))) { + const auto extra{ParseHex(input[1].get_str())}; + BOOST_CHECK_EQUAL(fixed_hasher.Hash(FromHex256(input[0]), ReadLE64(extra.data())), expected13uj); + } + } } }