#include #include #include #include "hashing_buffer.h" #include void test(size_t data_size) { std::vector vec(data_size); char * data = &vec[0]; for (size_t i = 0; i < data_size; ++i) data[i] = rand() & 255; uint128 reference = referenceHash(data, data_size); std::vector block_sizes = {56, 128, 513, 2048, 3055, 4097, 4096}; for (size_t read_buffer_block_size : block_sizes) { std::cout << "block size " << read_buffer_block_size << std::endl; std::stringstream io; DB::WriteBufferFromOStream out_(io); DB::HashingWriteBuffer out(out_); out.write(data, data_size); out.next(); //std::cout.write(data, data_size); //std::cout << std::endl; //std::cout << io.str() << std::endl; DB::ReadBufferFromIStream source(io, read_buffer_block_size); DB::HashingReadBuffer buf(source); std::vector read_buf(data_size); buf.read(read_buf.data(), data_size); bool failed_to_read = false; for (size_t i = 0; i < data_size; ++i) if (read_buf[i] != vec[i]) { failed_to_read = true; } if (failed_to_read) { std::cout.write(data, data_size); std::cout << std::endl; std::cout.write(read_buf.data(), data_size); std::cout << std::endl; FAIL("Fail to read data"); } if (buf.getHash() != reference) { std::cout << uint128ToString(buf.getHash()) << " " << uint128ToString(reference) << std::endl; FAIL("failed on data size " << data_size << " reading by blocks of size " << read_buffer_block_size); } if (buf.getHash() != out.getHash()) FAIL("Hash of HashingReadBuffer doesn't match with hash of HashingWriteBuffer on data size " << data_size << " reading by blocks of size " << read_buffer_block_size); } } int main() { test(5); test(100); test(2048); test(2049); test(100000); test(1 << 17); return 0; }