2011-08-14 55 views
11

大约需要多长时间,以及创建SHA-1数据散列需要多少处理能力?这取决于原始数据大小是否有很大差异?生成一个标准HTML文件的散列要比字符串“blah”长得多吗? C++,Java和PHP如何比较速度?SHA-1需要多长时间才能创建散列?

+1

“多久”完全取决于您运行的平台。 –

+10

请阅读http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – Joe

+0

你在使用哈希算什么? –

回答

10

你已经问了很多问题,所以希望我可以尝试依次回答每个问题。对于固定大小的数据块重复应用加密或解密例程,SHA-1(以及许多其他被设计为加密强度高的哈希)是基于加密或解密例程的。因此,当计算长字符串的散列值时,该算法比计算小字符串的散列值的时间成比例地多。在数学上,我们说使用SHA-1时,散列长度为N的字符串的运行时间为O(N)。因此,对HTML文档进行哈希处理所花费的时间应比对字符串“blah”进行哈希处理所花的时间要长,但只能按比例进行。它不会花费更长的时间来完成散列。在速度方面比较C++,Java和PHP,这是危险的领域,我的答案可能会被爆炸,但一般来说 C++比Java略快,它比PHP稍快。如果写得不好,用这些语言中的一种编写的散列实现可能会大大超越其他语言。但是,你不应该担心这一点。通常认为实施自己的散列函数,加密例程或解密例程是一个糟糕的主意,因为它们通常容易受到side-channel attacks的攻击,攻击者可以通过在实现中使用通常极其难以预料的错误来破坏安全。如果您想使用良好的散列函数,请使用预编写的版本。与手工操作相比,它可能会更快,更安全,并且不易出错。

最后,我建议不要使用SHA-1。 SHA-1存在已知的加密弱点,您应该考虑使用强大的散列算法,例如SHA-256。

希望这会有所帮助!

+0

对于指纹文件,SHA-1是否足够?只是问,因为这是我想要做的。另外,关于密码,我已经看到一些盐被用于少数系统,还有一些提到的一些算法叫做bch。 –

+2

如果您的目标只是获取指纹来检测意外的变化(而不是检测故意的篡改),那么SHA-1应该没问题(就像较弱的MD5一样)。但是,如果您使用散列来尝试构建密码系统,则应考虑使用其他算法。 – templatetypedef

+0

这是沿着这些线。我想使用散列作为避免文件重复或查看文件是否被修改的方式。我会看看稍后可以对密码做些什么。 –

5

密码散列函数的“速度”通常在“每个字节的clock cycles”中进行测量。看到这个page已经过时的比较 - 你可以看到实现和架构如何影响结果。结果变化很大程度上不仅是因为使用了算法,而且它们在很大程度上还取决于处理器体系结构,实施质量以及实施是否高效地使用硬件。这就是为什么一些公司专门创建硬件,特别适合尽可能有效地执行某些密码算法的确切目的。一个很好的例子是SHA-512,虽然它在比SHA-256更大的数据块上工作,但人们可能倾向于认为它应该比在较小输入上工作的SHA-256执行速度慢 - 但SHA-512尤其如此非常适合64位处理器,有时甚至比SHA-256更好。

所有现代哈希算法都在处理固定大小的数据块。它们对块执行固定数量的确定性操作,并对每个块执行此操作,直至最终获得结果。这也意味着您的输入时间越长,操作所需时间越长。根据刚刚解释的特征,我们可以推断操作的长度与消息的输入大小成正比。数学计算机科学地说,我们把它当作一个O(n)操作,其中n是消息的输入大小,正如templatetypedef已经指出的那样。

你不应该让哈希的速度影响你选择的编程语言,所有现代哈希算法真的很快,无论语言如何。尽管基于C的实现会比Java稍微好一点,但它实际上可能会比PHP稍微快一点,但我打赌在实践中你不会知道它的差别。

+1

@James Poulson:如果你只是想指纹并且不需要这是安全的,那么[CRC](http://en.wikipedia.org/wiki/CRC-32)校验和比使用SHA-1或任何其他加密散列函数更快。 – emboss

+0

是的!你会认为在这个星球上最大的科技犯傻子之前,FBI会问几个问题:问题的大小和执行自动化方法的时间!我会把C和Java的比例放在3倍左右。越接近裸机,越是P代码伤害你。 – RocketRoy

3

SHA-1通过64字节的块处理数据。因此,散列长度为n字节的文件所需的CPU时间大致等于处理一个块所需的CPU时间的n/64倍。对于短字符串,必须先将字符串转换为字节序列(SHA-1在字节上工作,而不是在字符上);字符串"blah"将变为4或8个字节(如果分别使用UTF-8或UTF-16),那么它将被散列为一个块。请注意,从字符到字节的转换可能比散列本身花费更多的时间。在我的PC(x86 Core2,2.4 GHz,64位模式)上使用来自sphlib的纯Java SHA-1实现,我可以以132 MB/s的带宽散列长消息(这是使用单个CPU核心)。请注意,这超出了普通硬盘的速度,所以当哈希大文件时,磁盘可能会成为瓶颈,而不是CPU:散列文件所需的时间将是所需的时间读取文件从磁盘。

(另外,使用C语言编写的本机代码,SHA-1速度上升到330 MB /秒。)

SHA-256被认为是广泛更安全比SHA-1,和一个纯Java实现的我的PC上SHA-256的速度为85 MB/s,速度仍然很快。截至2011年,不建议使用SHA-1。

相关问题