// Copyright 2024 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include #include template void test_bit_flip( unsigned char ch ) { int const N = 32; std::vector v( N, static_cast( ch ) ); for( int n = 1; n <= N; ++n ) { typename H::result_type r1 = {}; { H h; h.update( v.data(), n ); r1 = h.result(); } for( int j = 0; j < n * 8; ++j ) { v[ j / 8 ] ^= 1 << ( j % 8 ); H h; h.update( v.data(), n ); typename H::result_type r2 = h.result(); v[ j / 8 ] ^= 1 << ( j % 8 ); BOOST_TEST( r1 != r2 ) || std::fprintf( stderr, "Hash collision with bit %d flipped in %d * 0x%02X\n", j, n, ch ); } } } template void test_seq_length( unsigned char ch ) { int const N = 1024; std::vector v( N, static_cast( ch ) ); typename H::result_type r[ N ] = {}; for( int n = 0; n < N; ++n ) { H h; h.update( v.data(), n ); r[ n ] = h.result(); for( int j = 0; j < n; ++j ) { BOOST_TEST( r[j] != r[n] ) || std::fprintf( stderr, "Hash collision between %d * 0x%02X and %d * 0x%02X\n", j, ch, n, ch ); } } } template void test() { for( int ch = 0; ch <= 0xFF; ++ch ) { test_bit_flip( static_cast( ch ) ); test_seq_length( static_cast( ch ) ); } } int main() { test(); test(); test(); test(); test(); test(); return boost::report_errors(); }