From 55c503a0d0e274e09576410b2d91d2ace717a9c9 Mon Sep 17 00:00:00 2001 From: happyZYM Date: Sat, 25 May 2024 06:54:56 +0000 Subject: [PATCH] fix fatal bugs --- src/include/utils.h | 20 ++++++++++++++++++-- src/transaction_system.cpp | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/include/utils.h b/src/include/utils.h index 2dba6eb..52c75a2 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -16,8 +16,15 @@ inline hash_t SplitMix64Hash(const std::string &str) noexcept { hash_t ret = 0; int i = 0; size_t len = str.length(); + hash_t *buf = new hash_t; + char *buf_ptr = reinterpret_cast(buf); for (; i + 8 <= len; i += 8) { - ret ^= *reinterpret_cast(str.c_str() + i); + // ret ^= *reinterpret_cast(str.c_str() + i); + // ret ^= *reinterpret_cast(inner_salt + (i & 15)); + for (int j = 0; j < 8; ++j) { + buf_ptr[j] = str[i + j]; + } + ret ^= *buf; ret ^= *reinterpret_cast(inner_salt + (i & 15)); ret += 0x9e3779b97f4a7c15; ret = (ret ^ (ret >> 30)) * 0xbf58476d1ce4e5b9; @@ -32,6 +39,7 @@ inline hash_t SplitMix64Hash(const std::string &str) noexcept { ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; ret ^= ret >> 31; } + delete buf; return ret; } inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { @@ -43,8 +51,15 @@ inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { hash_t ret = 0; int i = 0; size_t len = str.length(); + hash_t *buf = new hash_t; + char *buf_ptr = reinterpret_cast(buf); for (; i + 8 <= len; i += 8) { - ret ^= *reinterpret_cast(str.data() + i); + // ret ^= *reinterpret_cast(str.data() + i); + // ret ^= *reinterpret_cast(inner_salt + (i & 15)); + for (int j = 0; j < 8; ++j) { + buf_ptr[j] = str[i + j]; + } + ret ^= *buf; ret ^= *reinterpret_cast(inner_salt + (i & 15)); ret += 0x9e3779b97f4a7c15; ret = (ret ^ (ret >> 30)) * 0xbf58476d1ce4e5b9; @@ -59,6 +74,7 @@ inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; ret ^= ret >> 31; } + delete buf; return ret; } diff --git a/src/transaction_system.cpp b/src/transaction_system.cpp index 83458cf..bde49a3 100644 --- a/src/transaction_system.cpp +++ b/src/transaction_system.cpp @@ -281,7 +281,7 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h PrintFullTimeStamp(train2_earliest_leaving_time_stamp, test_buf); LOG->debug("train2_earliest_leaving_time_stamp: {}", test_buf.str()); int cur_train2_leaving_time_stamp = train2_earliest_leaving_time_stamp; - int tran2_day_delta; + int tran2_day_delta = 0; if (cur_train2_leaving_time_stamp < cur_train1_arriving_time_stamp) { tran2_day_delta = (cur_train1_arriving_time_stamp - cur_train2_leaving_time_stamp + 1440 - 1) / 1440; cur_train2_leaving_time_stamp += tran2_day_delta * 1440; @@ -290,6 +290,7 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h cur_train2_leaving_time_stamp + train2_arrive_time_offeset[dest_station_offset] - train2_leave_time_offset[i]; if (!has_solution) { // just copy the first solution + LOG->debug("generating the first solution"); has_solution = true; res_train1_id = train1_price_data.trainID; res_train2_id = train2_price_data.trainID; @@ -300,14 +301,20 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h res_train1_price = train1_price_sum[transfer_station_offset] - train1_price_sum[start_station_offset]; res_train2_price = train2_price_sum[dest_station_offset] - train2_price_sum[i]; StationNameData station_name_data; + LOG->debug("trying to get station name data"); station_name_data_storage.Get(train1_ID_hash, station_name_data); + LOG->debug("successfully got station name data"); auto &str = station_name_data.name[transfer_station_offset]; res_transfer_station_name = ""; for (int i = 0; i < 40 && str[i] != '\0'; i++) res_transfer_station_name.push_back(str[i]); SeatsData train1_seats_data, train2_seats_data; + LOG->debug("trying to get train1 seats data"); seats_data_storage.Get({train1_ID_hash, train1_actual_start_date - train1_core_data.saleDate_beg}, train1_seats_data); + LOG->debug("successfully got train1 seats data"); + LOG->debug("trying to get train2 seats data"); seats_data_storage.Get({train2_ID_hash, tran2_day_delta}, train2_seats_data); + LOG->debug("successfully got train2 seats data"); res_train1_seat = train1_seats_data.seat[start_station_offset]; for (int j = start_station_offset + 1; j < transfer_station_offset; j++) { res_train1_seat = std::min(res_train1_seat, (int)train1_seats_data.seat[j]); @@ -317,6 +324,7 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h res_train2_seat = std::min(res_train2_seat, (int)train2_seats_data.seat[j]); } } else { + LOG->debug("trying to generate a new solution"); int cur_total_time = cur_train2_arriving_time_stamp - cur_train1_leaving_time_stamp; int existsing_total_time = res_train2_arriving_time_stamp - res_train1_leaving_time_stamp; int cur_total_price = train1_price_sum[transfer_station_offset] - train1_price_sum[start_station_offset] + @@ -350,14 +358,20 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h res_train1_price = train1_price_sum[transfer_station_offset] - train1_price_sum[start_station_offset]; res_train2_price = train2_price_sum[dest_station_offset] - train2_price_sum[i]; StationNameData station_name_data; + LOG->debug("trying to get station name data"); station_name_data_storage.Get(train1_ID_hash, station_name_data); + LOG->debug("successfully got station name data"); auto &str = station_name_data.name[transfer_station_offset]; res_transfer_station_name = ""; for (int i = 0; i < 40 && str[i] != '\0'; i++) res_transfer_station_name.push_back(str[i]); SeatsData train1_seats_data, train2_seats_data; + LOG->debug("trying to get train1 seats data"); seats_data_storage.Get({train1_ID_hash, train1_actual_start_date - train1_core_data.saleDate_beg}, train1_seats_data); + LOG->debug("successfully got train1 seats data"); + LOG->debug("trying to get train2 seats data"); seats_data_storage.Get({train2_ID_hash, tran2_day_delta}, train2_seats_data); + LOG->debug("successfully got train2 seats data"); res_train1_seat = train1_seats_data.seat[start_station_offset]; for (int j = start_station_offset + 1; j < transfer_station_offset; j++) { res_train1_seat = std::min(res_train1_seat, (int)train1_seats_data.seat[j]);