我希望比较哈希来检查碰撞(是的,我知道这很耗时,但不要紧,)。在检查碰撞时,需要比较散列。是在变量中使用单个哈希进行比较的最佳方法,或者是否拥有先前生成的所有哈希值的列表,并将最新哈希值与列表中的每个项目进行比较。
我更喜欢第一个选项,因为它更快,但有推荐的方法吗?你是否不太可能通过使用第一种方法找到碰撞?
答案 0 :(得分:2)
最好的方法是在变量中使用单个哈希值进行比较,或者拥有以前生成的所有哈希值的列表,并将最新哈希值与列表中的每个项目进行比较。
都不是。
我更喜欢第一个选项,因为它更快,但有推荐的方法吗?
我不明白为什么你认为第一种方法可行,但是你还没有完全解释你的情况。但是,如果你想检测重复的哈希值,你确实需要跟踪已经看到的哈希值:要做到这一点,你不想通过列表线性搜索,并且应该使用set容器来商店见过哈希;一个哈希表 - 正如gnasher729在几小时后的评论中所建议的那样 - 将给出O(1)性能,例如在哈希的C ++中是64位,std::unordered_set<uint64_t>
),或者是O(logN)性能的平衡二叉树(例如C ++ std::set<uint64_t>
)。
使用第一种方法是否不太可能发现碰撞?
你很可能会错过碰撞。
所有这一切,你可能想重新审视你的前提。良好(加密质量)哈希函数产生碰撞的可能性接近"birthday paradox"描述的几率。根据经验,如果你有2 ^ N个不同的值来哈希,那么如果你的哈希宽度超过2 * N位宽,那么统计不太可能看到冲突:如果你允许的话&#34;舒适&#34;,你更有可能被流星击中noggin,而不是程序看到碰撞。你提到了MD5,所以我期待128位:除非你存储数千万亿或更多(字面意义)的顺序,否则忽略碰撞的可能性是非常安全的。
请注意哈希值的一个重要用途,其中冲突由于不同的原因而更频繁地发生,并且在哈希表中,即使非冲突哈希值在它们之后也可能在相同的桶索引处发生冲突。重新包装&#34; - 当h % N
是桶的数量时,通常是la N
。一般来说,忽略哈希表中可能发生的冲突是不切实际的,而且非常不明智。