#define ROW_NUM (UINT8_MAX+2) /*total number of rows*/
#define ROW_LEN (HASH_LEN / CHAR_BIT) /*number of bits per row*/
#define ROW_NUM (UINT8_MAX+2) /*total number of rows*/
#define ROW_LEN (HASH_LEN / CHAR_BIT) /*number of bits per row*/
uint8_t backup[ROW_LEN];
const uint_fast32_t error_initial = get_error_table(data->table, UINT_FAST32_MAX);
uint_fast32_t error = error_initial;
uint8_t backup[ROW_LEN];
const uint_fast32_t error_initial = get_error_table(data->table, UINT_FAST32_MAX);
uint_fast32_t error = error_initial;
- TRACE("Initial error: %08X [row offset: %03u]", error_initial, data->row_offset);
+ TRACE("Initial error: %08X [row offset: %03u, threshold: %u]", error_initial, data->row_offset, data->threshold);
{
wchar_t filename_temp[_MAX_PATH];
swprintf_s(filename_temp, _MAX_PATH, L"%s~%X", filename, make_seed());
{
wchar_t filename_temp[_MAX_PATH];
swprintf_s(filename_temp, _MAX_PATH, L"%s~%X", filename, make_seed());
fwrite(&magic_number, sizeof(uint64_t), 1, file);
fwrite(&hash_len, sizeof(uint32_t), 1, file);
fwrite(&distance_min, sizeof(uint32_t), 1, file);
fwrite(&magic_number, sizeof(uint64_t), 1, file);
fwrite(&hash_len, sizeof(uint32_t), 1, file);
fwrite(&distance_min, sizeof(uint32_t), 1, file);
for (uint32_t i = 0; i < ROW_NUM; ++i)
{
const uint32_t checksum = adler32(&table[i][0], ROW_LEN);
for (uint32_t i = 0; i < ROW_NUM; ++i)
{
const uint32_t checksum = adler32(&table[i][0], ROW_LEN);
fread(&magic_number, sizeof(uint64_t), 1, file);
fread(&hash_len, sizeof(uint32_t), 1, file);
fread(&distance_min, sizeof(uint32_t), 1, file);
fread(&magic_number, sizeof(uint64_t), 1, file);
fread(&hash_len, sizeof(uint32_t), 1, file);
fread(&distance_min, sizeof(uint32_t), 1, file);
goto failed;
}
if ((hash_len != HASH_LEN) || (distance_min != DISTANCE_MIN))
{
printf("ERROR: Table properties are incompatibe with this instance!\n");
goto failed;
}
if ((hash_len != HASH_LEN) || (distance_min != DISTANCE_MIN))
{
printf("ERROR: Table properties are incompatibe with this instance!\n");
if ((fread(&checksum_expected, sizeof(uint32_t), 1, file) != 1) || (fread(&table[i][0], sizeof(uint8_t), ROW_LEN, file) != ROW_LEN))
{
printf("ERROR: Failed to read table data from file!\n");
if ((fread(&checksum_expected, sizeof(uint32_t), 1, file) != 1) || (fread(&table[i][0], sizeof(uint8_t), ROW_LEN, file) != ROW_LEN))
{
printf("ERROR: Failed to read table data from file!\n");
goto failed;
}
if (adler32(&table[i][0], ROW_LEN) != checksum_expected)
{
printf("ERROR: Table checksum does *not* match table contents!\n");
goto failed;
}
if (adler32(&table[i][0], ROW_LEN) != checksum_expected)
{
printf("ERROR: Table checksum does *not* match table contents!\n");
printf("MHash GenTableXOR V2 [%s]\n\n", __DATE__);
printf("HashLen: %d, Distance Min: %d, Threads: %d, MSVC: %u\n\n", HASH_LEN, DISTANCE_MIN, THREAD_COUNT, _MSC_FULL_VER);
printf("MHash GenTableXOR V2 [%s]\n\n", __DATE__);
printf("HashLen: %d, Distance Min: %d, Threads: %d, MSVC: %u\n\n", HASH_LEN, DISTANCE_MIN, THREAD_COUNT, _MSC_FULL_VER);
if (_waccess(argv[1], 4) == 0)
{
printf("Loading existing table data and proceeding...\n");
if (_waccess(argv[1], 4) == 0)
{
printf("Loading existing table data and proceeding...\n");
g_thread_data[t].stop = &stop_flag;
g_thread_data[t].mutex = &stop_mutex;
g_thread_data[t].row_offset = t * ((ROW_NUM) / THREAD_COUNT);
g_thread_data[t].stop = &stop_flag;
g_thread_data[t].mutex = &stop_mutex;
g_thread_data[t].row_offset = t * ((ROW_NUM) / THREAD_COUNT);
copy_table(g_thread_data[t].table, g_table);
PTHREAD_CREATE(&g_thread_id[t], NULL, thread_main, &g_thread_data[t]);
PTHREAD_SET_PRIORITY(g_thread_id[t], -15);
copy_table(g_thread_data[t].table, g_table);
PTHREAD_CREATE(&g_thread_id[t], NULL, thread_main, &g_thread_data[t]);
PTHREAD_SET_PRIORITY(g_thread_id[t], -15);
get_time_str(time_string, 64);
printf("\b\b\b[#] - %s\n", time_string);
get_time_str(time_string, 64);
printf("\b\b\b[#] - %s\n", time_string);