gpt4 book ai didi

Java - 哈希算法 - 最快的实现

转载 作者:IT老高 更新时间:2023-10-28 21:07:15 25 4
gpt4 key购买 nike

我想知道 Java 哈希算法的最佳和最快实现是什么,尤其是 MD5 和 SHA-2 512 (SHA512) 或 256。我想要一个函数来获取一个字符串作为参数并返回哈希作为结果.谢谢。

编辑:这是为了将每个 URL 映射到唯一的哈希值。由于 MD5 在这方面并不可靠,我更感兴趣的是找到 SHA-2 算法的最佳和最快的实现。请注意,我知道即使是 SHA-2 也可能会为某些 URL 生成相同的哈希值,但我可以接受。

最佳答案

第一件事:速度被高估了。您应该在声明给定算法“太慢”之前采取措施。大多数时候,哈希函数的速度无论如何都没有明显的差异。如果你对安全性有疑虑,那么先选择一个足够安全的哈希函数,然后只关心性能。

此外,您想要散列“字符串”。 Java String 在内部是一组 char 值数组中的一个 block ,这些值表示 Unicode 代码点(实际上是 Unicode 16 位代码单元,它使用 UTF 对代码点进行编码) -16)。散列函数将位或字节序列作为输入。所以你必须做一个转换步骤,例如str.getBytes("UTF-8"),获取你的字符串作为一串字节。与散列本身相比,转换步骤可能会产生不可忽略的成本。

注意:小心 URL 编码!在 URL 中,一些字节可以替换为以 '%' 符号开头的序列;这是为了支持不可打印的字符,但它也可以用于“标准”字符(例如,将 'a' 替换为 '%61')。这意味着两个不同的字符串(在 String.equals() 意义上)实际上可能表示相同的 URL(就 URL 处理而言)。根据您的情况,这可能是也可能不是问题。

您应该首先尝试将 Java 的 MessageDigest API 与标准(已安装)JCE 提供程序一起使用(即您调用 MessageDigest.getInstance("SHA-256")) ,并将结果作为基准。从理论上讲,JCE 可以将调用映射到使用“ native ”代码(用 C 或汇编编写)的实现,这将比使用 Java 更快。

话说回来……

sphlib是许多密码散列函数的开源实现,用 C 和 Java 编写。该代码已针对速度进行了优化,实际上,Java 版本比 Sun/Oracle 提供的标准 JRE 更快。使用this link以防上一个链接失败(主主机服务器有时因维护而停机,现在似乎就是这种情况)(警告:10 MB 下载)。该文件还包含一份报告(在 2010 年发表于 second SHA-3 candidate conference),该报告提供了在多个平台上的一些测量性能数据,针对 SHA-2 和即将到来的 SHA-3 的 14 个“第二轮”候选。

但您确实应该进行现场基准测试。例如,对 L1 缓存的影响会对性能产生巨大影响,并且无法通过单独运行函数代码来准确预测。

关于Java - 哈希算法 - 最快的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5446080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com