C++ 用于快速文件哈希的哈希算法是什么?

C++ 用于快速文件哈希的哈希算法是什么?,c++,hash,C++,Hash,正如标题所说,我正在寻找的是最好的通用哈希算法。散列一个10mb左右的文件应该比较快,并且应该尽可能安全以避免冲突 也可以理解,一个C++实现的链接,最好是一个允许它在一个免费但封闭的源应用中使用的许可证,如果可能的话,有一个付费的,封闭源程序。 < P>我会说,当哈希文件时,你的瓶颈很可能是文件I/O而不是散列算法本身。显然,除非你选择一个非常慢的散列算法(我知道在主流应用中没有一个算法这么慢),或者你的硬件非常不寻常和独特,否则这个观察结果是成立的 为了给您提供一些(非常不准确的)数字,大多

正如标题所说,我正在寻找的是最好的通用哈希算法。散列一个10mb左右的文件应该比较快,并且应该尽可能安全以避免冲突


也可以理解,一个C++实现的链接,最好是一个允许它在一个免费但封闭的源应用中使用的许可证,如果可能的话,有一个付费的,封闭源程序。

< P>我会说,当哈希文件时,你的瓶颈很可能是文件I/O而不是散列算法本身。显然,除非你选择一个非常慢的散列算法(我知道在主流应用中没有一个算法这么慢),或者你的硬件非常不寻常和独特,否则这个观察结果是成立的

为了给您提供一些(非常不准确的)数字,大多数加密散列算法的良好实现(可能比您需要的强得多)都以每秒数百兆字节或几千兆字节的速度运行,但大多数常见的磁盘系统以每秒数十兆字节或几百兆字节的速度运行

请注意,在这些(非常粗略的)数字中,我忽略了文件系统和操作系统的开销,并且我假设您将使用加密哈希算法(通常比简单的算法慢)

总而言之,我的建议是,您只需选择一些类似MD5、SHA-1或SHA-256(这些都是加密哈希)的东西,它们有很多好的、快速的和免费的实现,并且实际上消除了任何冲突的机会。与其选择一种快速但低劣的散列算法,不如优化I/O(通过异步/非阻塞读取文件),因为这就是瓶颈所在

以下是一些C/C++加密库,它们实现了各种散列函数,并且具有适合您的用例的许可证:


  • 我想说,当对文件进行哈希运算时,最可能的瓶颈是文件I/O,而不是哈希算法本身。显然,除非你选择一个非常慢的散列算法(我知道在主流应用中没有一个算法这么慢),或者你的硬件非常不寻常和独特,否则这个观察结果是成立的

    为了给您提供一些(非常不准确的)数字,大多数加密散列算法的良好实现(可能比您需要的强得多)都以每秒数百兆字节或几千兆字节的速度运行,但大多数常见的磁盘系统以每秒数十兆字节或几百兆字节的速度运行

    请注意,在这些(非常粗略的)数字中,我忽略了文件系统和操作系统的开销,并且我假设您将使用加密哈希算法(通常比简单的算法慢)

    总而言之,我的建议是,您只需选择一些类似MD5、SHA-1或SHA-256(这些都是加密哈希)的东西,它们有很多好的、快速的和免费的实现,并且实际上消除了任何冲突的机会。与其选择一种快速但低劣的散列算法,不如优化I/O(通过异步/非阻塞读取文件),因为这就是瓶颈所在

    以下是一些C/C++加密库,它们实现了各种散列函数,并且具有适合您的用例的许可证:


  • CRC-32?也许是艾德勒?速度在这里有多重要,真的吗?对于一个问题,从来没有最好的解决办法。@Philipp确实有,但它需要解决停顿问题PDoes算法需要加密安全(故意散列冲突可以用来破坏您的系统吗)?@NicoTranquire:即使yzt的答案在各个方面都是正确的,如果您想避免故意冲突,那么您应该避免使用MD5或SHA-1,因为这些算法上存在已知的冲突攻击(MD5甚至很容易破解,在现代计算机上需要几秒钟)。SHA-256或SHA-512就可以了。CRC-32?也许是Addler?速度在这里有多重要,真的吗?从来没有解决问题的最佳方案。@Philipp确实有,但它需要解决暂停问题。:PDES算法需要加密安全(故意散列冲突可以用来破坏你的系统吗)?@NicoTranquire:尽管yzt的答案在各个方面都是正确的,但如果你想避免故意冲突,那么你应该避免使用MD5或SHA-1,因为这些算法上存在已知的冲突攻击(MD5甚至很容易破坏,在现代计算机上需要几秒钟).SHA-256或SHA-512就可以了。专注于文件IO的开销是一个很好的建议。要解决这个问题,Mem映射也是一件很好的事情。@威尔:当然,内存映射输入文件会有帮助,但我认为对于这个特定的用例(按顺序从头到尾读取文件,)使用I/O技巧可能会产生更快的结果。@Will:(继续我的上一条评论!)哦,除非你将文件映射到内存中,并从一开始就开始散列,但系统性地提前触摸内存页,让操作系统有时间生成页面错误并将内容加载到内存中!这当然比乱处理容易(例如)Windows重叠I/O API或完成端口,或生成多个线程来执行I/O!@我想在这种情况下,重叠I/O会比内存映射更快,因为您已经知道,在操作系统找到它之前,您需要读取整个文件。@MarkRansom,您是对的。重叠IO很可能会被删除ter.然而,Memmapping很可能更容易实现,并且会在IO速度上提供一些改进,特别是如果你按照yzt建议的方法进行操作的话。专注于文件IO的开销是一个很好的建议。Memmapping也是一件很好的事情来解决这个问题。@Will:当然,内存映射输入文件会有所帮助,但我认为对于此特定用例(按顺序从头到尾读取文件,