//---------------------------------------------------------------------------------------------------------------------- // Copyright © 2021 by Brett Kuntz. All rights reserved. //---------------------------------------------------------------------------------------------------------------------- #include "compress3.h" //---------------------------------------------------------------------------------------------------------------------- //#include si main(si argc, s8 ** argv) { /*if (SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS)) { printf("Low priority set\n"); }*/ if (sem_init(&csoutput, 1, 1) == -1) { printf("sem_init error\n"); return EXIT_FAILURE; } if ((global_total = mmap(0, sizeof(u64), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)) == MAP_FAILED) { printf("mmap error\n"); return EXIT_FAILURE; } if (argc != 3) { printf("param error\n"); return EXIT_FAILURE; } CUTOFF = atol(argv[1]); // Old cutoff was around "160" : ((37 / 256) * 1024) + "small amount" to compensate for collisions const ul SAMPLES = atol(argv[2]); // Start printf("Starting\n"); const ui threads = get_nprocs(); SAMPLES_PER_TEST = round((r64)SAMPLES / threads); printf("CUTOFF we're testing: %u\n", CUTOFF); printf("SAMPLES: %lu\n", SAMPLES); printf("threads: %u\n", threads); printf("SAMPLES per thread: %lu\n", (ul)SAMPLES_PER_TEST); fflush(0); for (ui t=0;t best_distance) { best_n = n; best_distance = distance; } for (ui i=0;i<16;i++) { m[i] += BLAKE_IV; } } memcpy(m, input_iv, 128); for (ui i=0;i<16;i++) { m[i] += BLAKE_IV * best_n; } p_hash2(output_block, RO_IV, v, m, cutoff, input_block); si temp_distance = get_hash_score(output_block); if (temp_distance < 0) { for (ui i=0;i<128;i++) { output_block[i] = ~output_block[i]; } temp_distance = -temp_distance; } if (temp_distance != best_distance) { printf("ERROR: temp_distance [%d] != best_distance [%u]\nHash confirmation failed!!\n", temp_distance, best_distance); fflush(0); exit(EXIT_FAILURE); } if (distance) { *distance = temp_distance; } return best_n; } //---------------------------------------------------------------------------------------------------------------------- static void p_hash2(u8 * const restrict block, u64 const * const restrict RO_IV, u64 * const v, u64 const * const restrict m, const ui cutoff, u8 const * const restrict input_block) { // DONT FORGET TO ALSO TEST NON-COLLIDING!!! // DONT FORGET TO ALSO TEST NON-COLLIDING!!! // DONT FORGET TO ALSO TEST NON-COLLIDING!!! // Original hash score 250,000 samples: 108.2591 <= must beat this number, hopefully by a lot memcpy(v, RO_IV, 128); blake2b(v, m); ui p = -1; memset(block, 0, 128); for (ui i=0;i best_distance) { best_n = n; best_distance = distance; } for (ui i=0;i<16;i++) { m[i] += BLAKE_IV; } } memcpy(m, input_iv, 128); for (ui i=0;i<16;i++) { m[i] += BLAKE_IV * best_n; } hash(output_block, RO_IV, v, m, input_block); si temp_distance = get_hash_score(output_block); if (temp_distance < 0) { for (ui i=0;i<128;i++) { output_block[i] = ~output_block[i]; } temp_distance = -temp_distance; } if (temp_distance != best_distance) { printf("ERROR: temp_distance [%d] != best_distance [%u]\nHash confirmation failed!!\n", temp_distance, best_distance); fflush(0); exit(EXIT_FAILURE); } if (distance) { *distance = temp_distance; } return best_n; } //---------------------------------------------------------------------------------------------------------------------- static void hash(u8 * const restrict block, u64 const * const restrict RO_IV, u64 * const v, u64 const * const restrict m, u8 const * const restrict input_block) { u8 const * const restrict vp = (u8 *)v; memcpy(v, RO_IV, 128); blake2b(v, m); for (ui i=0;i<128;i++) { block[i] = vp[i] ^ input_block[i]; } } //---------------------------------------------------------------------------------------------------------------------- static si get_hash_score(void const * const block) { u8 const * const restrict vp = (u8 *)block; si population = 0; for (ui i=0;i<16;i++) { u64 temp; memcpy(&temp, &vp[i * 8], 8); population += __builtin_popcountl(temp); } return 512 - population; } //---------------------------------------------------------------------------------------------------------------------- static void blake2b(u64 * const restrict v, u64 const * const restrict m) { #define G(x, y, a, b, c, d) \ do { \ a = a + b + m[x]; \ d = ((d ^ a) >> 32) | ((d ^ a) << 32); \ c = c + d; \ b = ((b ^ c) >> 24) | ((b ^ c) << 40); \ a = a + b + m[y]; \ d = ((d ^ a) >> 16) | ((d ^ a) << 48); \ c = c + d; \ b = ((b ^ c) >> 63) | ((b ^ c) << 1); \ } while (0) G(13, 11, v[ 0], v[ 4], v[ 8], v[12]); G( 7, 14, v[ 1], v[ 5], v[ 9], v[13]); G(12, 1, v[ 2], v[ 6], v[10], v[14]); G( 3, 9, v[ 3], v[ 7], v[11], v[15]); G( 5, 0, v[ 0], v[ 5], v[10], v[15]); G(15, 4, v[ 1], v[ 6], v[11], v[12]); G( 8, 6, v[ 2], v[ 7], v[ 8], v[13]); G( 2, 10, v[ 3], v[ 4], v[ 9], v[14]); #undef G } //---------------------------------------------------------------------------------------------------------------------- static u64 tick(void) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); return ((u64)now.tv_sec * 1000) + ((u64)now.tv_nsec / 1000000); } //----------------------------------------------------------------------------------------------------------------------