计算两个文件中的CRC(或更佳的sha1sum)都需要读取每个字节。如果进行逐字节比较,发现不匹配就可以立即退出-您不必担心两个不同的文件恰好具有相同的校验和(尽管对于sha1sum来说消失的可能性很小) 。因此,如果您在本地进行比较,则逐字节比较至少会和校验和比较一样快(除非您已经计算了校验和)。
另一方面,当您比较不在同一台计算机上的文件时,校验和比较很有用。校验和可以在本地计算,您不必通过网络传输全部内容。
混合方法也是可能的。例如,您可以一次计算并比较两个文件的校验和,这可以避免读取整个文件(如果它们不同),同时还可以避免通过网络传输整个文件。在rsync的协议做这样的事情。
请注意,如Dave Rager在其回答中所述,使用简单的CRC可以给您带来很大的碰撞机会。至少使用sha1sum,甚至更新的东西。(不要尝试发明自己的哈希算法;开发sha1sum的人比我们任何人都对这种东西了解得多。)
至于冲突的可能性,如果您使用像sha1sum这样的体面的哈希,则几乎不必担心它,除非有人故意和昂贵地构造其sha1sums发生冲突的文件(当我第一次编写此文件时,生成此类冲突是不可行的) ,但正在取得进展)。引用Scott Chacon的“ Pro Git”,第6.1节:
这是一个示例,可让您大致了解发生SHA-1冲突的情况。如果地球上所有的65亿人都在编程,并且每一秒钟,每个人所产生的代码都相当于整个Linux内核历史记录(100万个Git对象)并将其推入一个巨大的Git存储库,则需要5年的时间该存储库包含足够的对象,以使发生一次SHA-1对象冲突的可能性为50%。更有可能的是,您的编程团队的每个成员都将在同一晚被无关事件中的狼袭击并杀死。
总结:
逐字节比较适用于本地比较。sha1sum可用于远程比较,并且不会有很大的误报率。