我想提高散列大文件的性能,例如几十 GB 的大小。
通常,您使用散列函数顺序散列文件的字节(例如,SHA-256,尽管我很可能会使用 Skein,因此与从 [快速] SSD)。我们称之为方法 1。
这个想法是在 8 个 CPU 上并行散列文件的多个 1 MB 块,然后将连接的散列散列成单个最终散列。我们称之为方法 2。
描述此方法的图片如下:
我想知道这个想法是否合理以及损失了多少“安全性”(就更可能发生的冲突而言)与在整个文件的跨度上进行单个散列。
例如:
让我们使用 SHA-2 的 SHA-256 变体并将文件大小设置为 2^34=34,359,738,368 字节。因此,使用简单的单通道(方法 1),我将获得整个文件的 256 位散列。
将此与以下内容进行比较:
使用并行散列(即方法 2),我会将文件分解为 32,768 个 1 MB 的块,使用 SHA-256 将这些块散列为 32,768 个 256 位(32 字节)的散列,连接散列并进行最终散列结果连接了 1,048,576 字节的数据集,以获得整个文件的最终 256 位哈希。
就碰撞的可能性和/或可能性而言,方法 2 是否比方法 1 更不安全?也许我应该将这个问题改写为:方法 2 是否使攻击者更容易创建一个散列到与原始文件相同的散列值的文件,当然除了一个微不足道的事实,即蛮力攻击会更便宜,因为哈希可以在N个cpus上并行计算吗?
更新:我刚刚发现我在方法 2 中的构造与哈希列表的概念非常相似。但是,与方法 1(文件的普通旧哈希)相比,上句中的链接引用的 Wikipedia 文章没有详细说明哈希列表在冲突机会方面的优劣,当只有顶部哈希时使用哈希列表。