【发布时间】:2013-04-24 11:15:39
【问题描述】:
我想存储大约 20 亿个字符串的哈希值。为此,我希望使用尽可能少的存储空间。
考虑一个理想的散列算法,它将散列返回为一系列十六进制数字(如 md5 散列)。 据我了解这个想法,这意味着我需要哈希不小于且不超过 8 个符号的长度。因为这样的散列能够散列 4+ 十亿(16 * 16 * 16 * 16 * 16 * 16 * 16 * 16)个不同的字符串。
所以我想知道将哈希切成一定长度以节省空间是否安全? (当然,哈希不应该冲突)
是/否/也许 - 我希望得到相关研究的解释或链接的答案。
附: - 我知道我可以测试 8 个字符的哈希是否可以存储 20 亿个字符串。但我需要将 20 亿个哈希值与它们的 20 亿个切割版本进行比较。这对我来说似乎并不简单,所以我最好在这样做之前先问清楚。
【问题讨论】:
-
注意:将散列存储为 8 字节 字符串 将只允许 1
-
20 亿个字符串的 32 位哈希不太可能不包含任何冲突。
-
粗略的经验法则:要散列
n事物而不发生冲突,您需要n^2垃圾箱。如果您有2^31字符串,则需要2^62箱以避免冲突。 -
罗伯特·库珀:很抱歉,您所说的“垃圾箱”是什么意思?