write date and time related utils

This commit is contained in:
2024-05-22 14:21:37 +00:00
parent b108a0f122
commit b743f12cd4
3 changed files with 100 additions and 5 deletions

View File

@ -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

View File

@ -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
View 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;
}