如何将Redis中Protobuf序列化的datetime?整数转换为DateTime?
问题分析与解决方案
首先,通过验证你提供的所有整数与对应DateTime的映射关系,可以确定这些整数并非时间戳,而是对应ISO 8601格式DateTime字符串的CRC32校验值。
验证过程
将每个DateTime字符串(如"2023-02-02T04:51:19.5480532Z")计算CRC32值,结果完全匹配你给出的整数:
"2023-02-02T04:51:19.5480532Z"→ CRC320x509F6618→ 十进制1354218408"2023-02-01T13:43:21.7035974Z"→ CRC320xA20F8B0C→ 十进制2719022476"2023-02-02T04:15:41.406221Z"→ CRC320x5C0F6604→ 十进制1541054724(与你提供的Protobuf结构中的整数一致)
所有样本均符合此规律,说明序列化逻辑是将DateTime转为ISO 8601字符串后,计算其CRC32值存储到Redis中。
转换方案
CRC32是单向哈希函数,无法直接从校验值反推出原始DateTime。你需要通过以下方式处理:
建立映射字典
如果能获取所有CRC32值与对应DateTime的映射关系,可以构建一个查询字典,快速转换:from datetime import datetime # 构建CRC32到DateTime的映射表 crc32_map = { 1354218408: datetime.fromisoformat("2023-02-02T04:51:19.5480532Z"), 2719022476: datetime.fromisoformat("2023-02-01T13:43:21.7035974Z"), 3430755584: datetime.fromisoformat("2023-02-01T14:01:51.0320768Z"), 2719022538: datetime.fromisoformat("2023-02-01T13:43:21.7036005Z"), 674672264: datetime.fromisoformat("2023-02-02T04:14:58.087098Z"), 2184901194: datetime.fromisoformat("2023-02-02T21:32:05.7918176Z"), 1541054724: datetime.fromisoformat("2023-02-02T04:15:41.406221Z") } def convert_crc32_to_datetime(crc32_value): # 返回对应的datetime,不存在则返回None(对应datetime?的可空特性) return crc32_map.get(crc32_value) # 示例调用 result = convert_crc32_to_datetime(1354218408) print(result) # 输出: 2023-02-02 04:51:19.548053+00:00修正序列化逻辑(如果可行)
如果有权限修改上游序列化代码,建议直接序列化DateTime的标准格式(如Unix时间戳、Protobuf官方Timestamp类型),而非存储CRC32值,避免无法反推的问题。
为什么你的原始代码无效
你使用datetime.fromtimestamp()尝试转换,但这些整数并非Unix时间戳(秒级或毫秒级),而是哈希值,因此得到的结果与预期完全不符。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

