我想知道哈希算法在MD5和SHA-2512 (SHA512)或256上的最好和最快的实现。我想要一个函数来获取一个字符串作为参数,并返回散列作为结果。谢谢你。
Edit:用于将每个URL映射到唯一的散列。由于MD5在这方面并不可靠,我更感兴趣的是为SHA-2算法找到最好和最快的实现。请注意,我知道即使是SHA-2也可能对某些URL产生相同的散列,但我可以接受这一点。
发布于 2011-03-28 20:33:41
首先要做的是:速度被高估了。在宣布一个给定的算法“太慢”之前,你应该做一些测量。大多数情况下,哈希函数的速度并没有明显的区别。如果您对安全性有顾虑,那么首先选择一个足够安全的散列函数,然后只考虑性能。
此外,您还希望对“字符串”进行散列。Java在内部是表示String代码点的Unicode值数组中的块(实际上是使用char -16对代码点进行编码的Unicode16位代码单元)。散列函数将位或字节序列作为输入。所以你必须进行一个转换步骤,例如str.getBytes("UTF-8"),以获得一串字节形式的字符串。与散列本身相比,转换步骤可能具有不可忽略的成本。
注意:注意URL编码!在网址中,某些字节可以替换为以'%‘符号开头的序列;这意味着支持不可打印的字符,但也可以用于“标准”字符(例如,将“a”替换为“%61”)。这意味着两个不同的字符串(在String.equals()意义上)实际上可能代表相同的URL (就String.equals()处理而言)。根据您的情况,这可能是问题,也可能不是问题。
您应该首先尝试将Java与标准的(已经安装的) MessageDigest提供程序(即调用MessageDigest.getInstance("SHA-256"))一起使用,然后测试结果。理论上,JCE可以使用“本机”代码(用C或汇编语言编写)将调用映射到实现,这将比使用Java获得的速度更快。
话虽如此..。
sphlib是许多密码散列函数的开源实现,用C和Java编写。代码已经针对速度进行了优化,并且在实践中,Java版本比Sun/Oracle提供的标准JRE更快。使用this link,以防之前的链路出现故障(主主机服务器有时会因为维护而关闭,就像现在的情况一样)(警告:10MB下载)。该档案还包含一份报告(在2010年的second SHA-3 candidate conference上提交),该报告给出了几个平台上的一些测量性能数据,包括SHA-2和即将到来的SHA-3的14个“第二轮”候选者。
但是你真的应该做一些实际的基准测试。例如,对L1缓存的影响可能会对性能产生很大的影响,并且无法通过单独运行函数代码来准确预测。
发布于 2011-03-27 07:28:47
编辑:我最初读到的问题是什么是“最快的散列算法”,它已经被澄清为“每种算法的最快实现”。这是一个合理的问题,其他人已经指出了更快的实现。但是,除非您在短时间内散列大量数据,否则这并不重要。我怀疑通常是否值得花费时间和复杂性来使用标准JCE所提供的以外的东西。
对于URL地址,您需要在现代硬件上使用每秒超过一百万次的SHA-256进行散列,以要求更快的速度。我无法想象大多数应用程序每秒需要超过1000次(每天超过8600万次),这意味着散列花费的总CPU时间将远远不到1%。因此,即使你有一个无限快的散列算法,你最多也只能将整体性能提高1%。
原始答案:既能获得最好的,又能得到最快的,这两者是不一致的。散列越好,速度通常越慢。如果你真的需要速度和安全性,那就使用MD5。如果您需要最好的安全性,那么使用SHA-256甚至SHA-512。你没有提到你用它来做什么,所以很难推荐其中的一个。使用SHA-256可能是最安全的,因为对于现代硬件上的大多数用例来说,它应该足够快了。下面是你怎么做的:
String input = "your string";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(input.getBytes("UTF-8"));
byte[] hash = digest.digest();如果您将其用于安全目的,如散列密码,那么您也应该在摘要中添加盐。如果你想从散列中取出一个可打印的字符串,你可以把它编码回一个十六进制的字符串:
static char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder(hash.length * 2);
for (byte b : hash) {
sb.append(HEX_CHARS[(b & 0xF0) >> 4]);
sb.append(HEX_CHARS[b & 0x0F]);
}
String hex = sb.toString();发布于 2011-03-27 07:24:45
查看以下内容:Lots of SHA / MD5 examples
还有:From same thread: Fast MD5
String hash = MD5.asHex(MD5.getHash(new File(Filename);
https://stackoverflow.com/questions/5446080
复制相似问题