write date and time related utils
This commit is contained in:
@ -3,6 +3,7 @@
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <utility>
|
||||
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<const hash_t *>(str.c_str() + i);
|
||||
ret ^= *reinterpret_cast<const hash_t *>(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<const hash_t *>(str.data() + i);
|
||||
ret ^= *reinterpret_cast<const hash_t *>(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<uint8_t, uint8_t> 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<uint8_t, uint8_t> 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
|
@ -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)
|
||||
add_executable(hash_collision_test hash_collision_test.cpp)
|
||||
add_executable(utils_test utils_test.cpp)
|
25
test/utils_test.cpp
Normal file
25
test/utils_test.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
#include "../src/include/utils.h"
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
int main() {
|
||||
int time_stamp = 0;
|
||||
for (int i = 0; i <= 365; i++) {
|
||||
std::pair<int, int> 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;
|
||||
}
|
Reference in New Issue
Block a user