diff --git a/src/crypto/equihash.cpp b/src/crypto/equihash.cpp index b5caba956..ea64e5f6b 100644 --- a/src/crypto/equihash.cpp +++ b/src/crypto/equihash.cpp @@ -317,28 +317,6 @@ bool Equihash::BasicSolve(const eh_HashState& base_state, return false; } -template -bool IsProbablyDuplicate(std::shared_ptr indices, size_t lenIndices) -{ - assert(lenIndices <= MAX_INDICES); - bool checked_index[MAX_INDICES] = {false}; - bool count_checked = 0; - for (int z = 0; z < lenIndices; z++) { - // Skip over indices we have already paired - if (!checked_index[z]) { - for (int y = z+1; y < lenIndices; y++) { - if (!checked_index[y] && indices.get()[z] == indices.get()[y]) { - // Pair found - checked_index[y] = true; - count_checked += 2; - break; - } - } - } - } - return count_checked == lenIndices; -} - template void CollideBranches(std::vector>& X, const size_t hlen, const size_t lenIndices, const unsigned int clen, const unsigned int ilen, const eh_trunc lt, const eh_trunc rt) { diff --git a/src/crypto/equihash.tcc b/src/crypto/equihash.tcc index f10fe2ced..9b0190811 100644 --- a/src/crypto/equihash.tcc +++ b/src/crypto/equihash.tcc @@ -22,6 +22,28 @@ bool DistinctIndices(const FullStepRow& a, const FullStepRow& b, s return true; } +template +bool IsProbablyDuplicate(std::shared_ptr indices, size_t lenIndices) +{ + assert(lenIndices <= MAX_INDICES); + bool checked_index[MAX_INDICES] = {false}; + bool count_checked = 0; + for (int z = 0; z < lenIndices; z++) { + // Skip over indices we have already paired + if (!checked_index[z]) { + for (int y = z+1; y < lenIndices; y++) { + if (!checked_index[y] && indices.get()[z] == indices.get()[y]) { + // Pair found + checked_index[y] = true; + count_checked += 2; + break; + } + } + } + } + return count_checked == lenIndices; +} + template bool IsValidBranch(const FullStepRow& a, const size_t len, const unsigned int ilen, const eh_trunc t) { diff --git a/src/gtest/test_equihash.cpp b/src/gtest/test_equihash.cpp index 0b9051833..81ddf1908 100644 --- a/src/gtest/test_equihash.cpp +++ b/src/gtest/test_equihash.cpp @@ -3,6 +3,16 @@ #include "crypto/equihash.h" +TEST(equihash_tests, is_probably_duplicate) { + std::shared_ptr p1 (new eh_trunc[4] {0, 1, 2, 3}); + std::shared_ptr p2 (new eh_trunc[4] {0, 1, 1, 3}); + std::shared_ptr p3 (new eh_trunc[4] {3, 1, 1, 3}); + + ASSERT_FALSE(IsProbablyDuplicate<4>(p1, 4)); + ASSERT_FALSE(IsProbablyDuplicate<4>(p2, 4)); + ASSERT_TRUE(IsProbablyDuplicate<4>(p3, 4)); +} + TEST(equihash_tests, check_basic_solver_cancelled) { Equihash<48,5> Eh48_5; crypto_generichash_blake2b_state state;