【发布时间】:2018-10-17 03:47:49
【问题描述】:
我想要以下机制:
int64_t MyHash (const std::string& value);
- 输入任何
std::string(通常为 100 字节) - 函数输出一个 64 位整数值
- 但是,该整数表示的最大值应在
-2<sup>53</sup> to 2<sup>53</sup>-1的范围内
我尝试使用std::hash();问题在于:每个平台都不同。不仅如此,每次运行都会有所不同。
目前,使用Qt 的QCryptographicHash 我得到一个SHA256 校验和,并且我正在截断为64 位。即使在这种截断中,碰撞的可能性也会增加。
无论如何,我的目标是在 54 位内获得该值。一个明显的解决方案是将这个数字除以 2048。
问题:有没有更好的解决方案来获得 54 位的哈希?
Javascript解决方案也很好。
目的:这个值被传递给 Javascript。现在它的数据类型 number 可以容纳一个 64 位双精度数,即 54 位。
【问题讨论】:
-
鸽巢原理说,你根本不可能有 256^100 个不同的字符串到 2^54 个唯一的哈希值。事实上,你甚至不能将 256^7 个不同的字符串散列为 2^54 个唯一的散列。您可以期望的最好结果是均匀分布的,即每个哈希有 2^746 次冲突。
标签: javascript c++ qt hash checksum