3字节输出哈希算法咨询:6字节转3字节/2字节转1字节C实现需求
需求可行性判断
2字节输入输出1唯一字节
- 不可行:2字节输入共有
2^16 = 65536种不同取值,1字节输出仅2^8 = 256种取值,根据鸽巢原理,必然存在至少2个不同输入对应同一个输出,无法实现全量输入下的完全唯一映射。
6字节输入输出3唯一字节
- 不可行:6字节输入共有
2^48种不同取值,3字节输出仅2^24种取值,同样符合鸽巢原理的碰撞必然性,无法实现全量输入下的完全唯一映射。
补充说明:如果你的实际项目中用到的输入集合总数量不超过对应输出的最大取值数(比如2字节输入的实际使用量≤256,6字节输入的实际使用量≤16777216),可以针对你的固定输入集合构造完美哈希实现无碰撞,否则只能选择碰撞概率足够低的通用哈希算法。如果你的输入是固定的有限集合,最简单的无碰撞实现是查表法:先把所有用到的输入列出来,给每个输入分配唯一的输出值,运行时直接查表即可。
低碰撞哈希C语言实现
如果你可以接受极低概率的碰撞,满足普通项目的使用需求,可以参考以下实现:
2字节输入输出1字节哈希
#include <stdint.h> // 输入为2字节的uint16_t类型,输出为1字节的uint8_t类型 uint8_t hash_2to1(uint16_t input) { input ^= input >> 8; input *= 0x45d9f3b; input ^= input >> 8; return (uint8_t)input; }
6字节输入输出3字节哈希
#include <stdint.h> // 输入为长度6的uint8_t数组,输出为低24位有效的3字节值,最高8位固定为0 uint32_t hash_6to3(const uint8_t input[6]) { uint32_t h = 0x811c9dc5; for (int i = 0; i < 6; i++) { h ^= input[i]; h *= 0x01000193; } return h & 0xFFFFFF; }
内容的提问来源于stack exchange,提问作者Zachary Denny
相关产品推荐
相关产品推荐

