Hash 切土豆条安全吗?

Hash 切土豆条安全吗?,hash,md5,keccak,Hash,Md5,Keccak,我想为大约20亿个字符串存储哈希。为此,我希望使用尽可能少的存储空间 考虑一个理想的散列算法,它以十六进制数字序列的形式返回散列(如md5散列)。 据我所知,这意味着我需要哈希长度不少于8个符号。因为这样的散列可以散列40多亿(16*16*16*16*16*16)个不同的字符串 所以我想知道将散列剪切到一定长度以节省空间是否安全? (当然,散列不应该冲突) 是/否/可能-我希望得到解释或相关研究链接的答案 我知道我可以测试8个字符的散列是否可以存储20亿个字符串。但我需要将20亿个哈希与20亿个

我想为大约20亿个字符串存储哈希。为此,我希望使用尽可能少的存储空间

考虑一个理想的散列算法,它以十六进制数字序列的形式返回散列(如md5散列)。 据我所知,这意味着我需要哈希长度不少于8个符号。因为这样的散列可以散列40多亿(16*16*16*16*16*16)个不同的字符串

所以我想知道将散列剪切到一定长度以节省空间是否安全? (当然,散列不应该冲突)

是/否/可能-我希望得到解释或相关研究链接的答案


我知道我可以测试8个字符的散列是否可以存储20亿个字符串。但我需要将20亿个哈希与20亿个剪切版本进行比较。这对我来说并不微不足道,所以我最好在做这件事之前先问一下。

散列是一个数字,而不是十六进制数字(字符)的字符串。对于MD5,它是以有效形式保存的128位或16字节。如果你的问题仍然适用,你当然可以考虑截断数字(通过强制一个字或第一位移位)。好的散列算法均匀地分布到所有位

增编:


通常,无论何时处理哈希,都需要检查字符串是否匹配。这考虑了哈希冲突的可能性。剪切散列的次数越多,得到的冲突就越多。但是,在这一阶段进行计划是很好的。

x值存储在只能表示2x不同散列值的散列域中是否安全完全取决于您是否能够容忍冲突

散列函数实际上是随机数生成器,因此您计算的20亿个散列值将均匀分布在大约40亿个可能的结果上。这意味着您将受到以下限制:

在您的例子中,如果您仅使用2^32(40亿)个可能的散列值计算2^31(20亿)个散列,则至少两个具有相同散列(冲突)的可能性非常非常接近100%。(三个相同的概率也非常非常接近100%,以此类推)我找不到根据这些数字计算可能碰撞次数的公式,但我怀疑这是一个巨大的数字

如果在您的例子中,哈希冲突不是一场灾难(例如在Java的HashMap实现中,它通过将哈希目标转换为共享同一哈希键的对象列表来处理冲突,尽管这会降低性能),那么您可能可以肯定地活在大量冲突中。但是如果您需要唯一性,那么您需要一个大得多的散列域,或者您需要根据您的目的为每个记录分配一个保证唯一的序列ID号


最后,请注意,Keccak能够生成任何所需的输出长度,因此,花费CPU资源生成长散列输出,而只是在之后将其缩减,这没有什么意义。您应该能够告诉Keccak函数只给出所需的位数。(还请注意,Keccak输出长度的更改不会影响初始输出位,因此结果将与之后手动按位微调的结果完全相同。)

注意:将哈希存储为8字节字符串只允许1。20亿字符串的32位哈希不可能不包含任何冲突。粗略的经验法则:要对
n
事物进行哈希而不发生冲突,您需要
n^2
bin。如果您有
2^31
字符串,您将需要
2^62
箱子以避免碰撞。罗伯特·库珀:对不起,您所说的“箱子”是什么意思?好的,它是一个数字。但是2^32仍然是我在上面写的40多亿个组合。哪些散列算法是“好的”?Md5有冲突。你指的是什么哈希算法?@Termos:好吧,我误解了你的问题。也许你根本不需要任何散列。