diff --git a/src/include/utils.h b/src/include/utils.h index 4c21022..028de36 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -3,6 +3,7 @@ #include #include #include +#include typedef uint64_t hash_t; inline hash_t SplitMix64Hash(const std::string &str) noexcept { // constexpr static char salt1[10] = "mL;]-=eT"; @@ -12,7 +13,8 @@ inline hash_t SplitMix64Hash(const std::string &str) noexcept { // str = salt1 + str + salt2; hash_t ret = 0; int i = 0; - for (; i + 8 <= str.length(); i += 8) { + size_t len = str.length(); + for (; i + 8 <= len; i += 8) { ret ^= *reinterpret_cast(str.c_str() + i); ret ^= *reinterpret_cast(inner_salt + (i & 15)); ret += 0x9e3779b97f4a7c15; @@ -20,7 +22,7 @@ inline hash_t SplitMix64Hash(const std::string &str) noexcept { ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; ret ^= ret >> 31; } - for (; i < str.length(); ++i) { + for (; i < len; ++i) { ret ^= str[i]; ret ^= inner_salt[i & 15]; ret += 0x9e3779b97f4a7c15; @@ -38,7 +40,8 @@ inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { // str = salt1 + str + salt2; hash_t ret = 0; int i = 0; - for (; i + 8 <= str.length(); i += 8) { + size_t len = str.length(); + for (; i + 8 <= len; i += 8) { ret ^= *reinterpret_cast(str.data() + i); ret ^= *reinterpret_cast(inner_salt + (i & 15)); ret += 0x9e3779b97f4a7c15; @@ -46,7 +49,7 @@ inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; ret ^= ret >> 31; } - for (; i < str.length(); ++i) { + for (; i < len; ++i) { ret ^= str[i]; ret ^= inner_salt[i & 15]; ret += 0x9e3779b97f4a7c15; @@ -56,4 +59,70 @@ inline hash_t SplitMix64Hash(const std::string_view &str) noexcept { } return ret; } + +/** + * Note that in our system, all the dates are within the year 2024. + */ +inline std::pair RetrieveReadableDate(int day_id) { + // the day_id is 0-based, that is, 2024-01-01 is day 0. + // clang-format off + static const uint8_t month_lookup[366] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 + }; + + static const uint8_t day_lookup[366] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 + }; + // clang-format on + + return std::make_pair(month_lookup[day_id], day_lookup[day_id]); +} + +inline int GetCompactDate(int month, int day) { + // the day_id is 0-based, that is, 2024-01-01 is day 0. + // clang-format off + static const int lookup[12] = { + 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 + }; + // clang-format on + return lookup[month - 1] + day - 1; +} + +inline void RetrieveReadableTimeStamp(int full_time_stamp, int &month, int &day, int &hour, int &minute) { + int day_id = full_time_stamp / 1440; + int minute_id = full_time_stamp % 1440; + std::pair date = RetrieveReadableDate(day_id); + month = date.first; + day = date.second; + hour = minute_id / 60; + minute = minute_id % 60; +} + + +inline int GetFullTimeStamp(int month, int day, int hour, int minute) { + int day_id = GetCompactDate(month, day); + return day_id * 1440 + hour * 60 + minute; +} #endif \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 02b52e9..56c0b49 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -23,4 +23,5 @@ if(ENABLE_ADVANCED_FEATURE) add_executable(snapshot_test snapshot_test.cpp) target_link_libraries(snapshot_test storage dataguard GTest::gtest_main spdlog::spdlog) endif() -add_executable(hash_collision_test hash_collision_test.cpp) \ No newline at end of file +add_executable(hash_collision_test hash_collision_test.cpp) +add_executable(utils_test utils_test.cpp) \ No newline at end of file diff --git a/test/utils_test.cpp b/test/utils_test.cpp new file mode 100644 index 0000000..e6a265b --- /dev/null +++ b/test/utils_test.cpp @@ -0,0 +1,25 @@ +#include "../src/include/utils.h" +#include +#include +int main() { + int time_stamp = 0; + for (int i = 0; i <= 365; i++) { + std::pair date = RetrieveReadableDate(i); + std::cout << i << " " << date.first << " " << date.second << std::endl; + assert(GetCompactDate(date.first, date.second) == i); + for (int j = 0; j < 1440; j++) { + int std_hour = j / 60; + int std_minute = j % 60; + int out_month, out_day, out_hour, out_minute; + assert(time_stamp == i * 1440 + j); + RetrieveReadableTimeStamp(time_stamp, out_month, out_day, out_hour, out_minute); + assert(out_month == date.first); + assert(out_day == date.second); + assert(out_minute == std_minute); + assert(out_hour == std_hour); + assert(GetFullTimeStamp(out_month, out_day, out_hour, out_minute) == time_stamp); + time_stamp++; + } + } + return 0; +} \ No newline at end of file