当前位置: 首页 > 面试题库 >

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

闽经纬
2023-03-14
问题内容

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

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


问题答案:

首先,速度过高。在声明给定算法“太慢”之前,您应该采取措施。在大多数情况下,哈希函数的速度不会产生明显的变化。如果您对安全性存有疑虑,则首先选择一个足够安全的哈希函数,然后才担心性能。

此外,您想散列“字符串”。Java String在内部是char表示Unicode代码点(实际上是使用UTF-16编码代码点的Unicode
16位代码单元)的值数组中的一部分。哈希函数将一系列位或字节作为输入。因此,您将必须执行一个转换步骤,例如str.getBytes("UTF-8"),以一串字节的形式获取您的字符串。与散列本身相比,转换步骤的成本很有可能不可忽略。

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

您应该首先尝试将Java的MessageDigestAPI与标准的(已安装的)JCE提供程序一起使用(即调用MessageDigest.getInstance("SHA-256")),然后对结果进行处理。从理论上讲,JCE可以将调用映射到使用“本机”代码(用C或汇编语言编写)的实现,这将比使用Java更快。

话虽如此…

sphlib是C和Java中许多加密哈希函数的开源实现。该代码已针对速度进行了优化,实际上,Java版本比Sun
/
Oracle提供的标准JRE更快。万一先前的链接失败了,请使用此链接(有时主机主服务器由于维护而关闭,现在看来是这样)(警告:下载10
MB)。该档案还包含一份报告(在2010年第二届SHA-3候选人大会上发表),该报告提供了一些平台上SHA-2的性能测量数据以及即将推出的SHA-3的14个“第二轮”候选人。

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



 类似资料:
  • 问题内容: 我目前正在尝试了解为Python的内置数据类型定义的哈希函数背后的机制。该实现显示在底部,以供参考。我特别感兴趣的是选择此分散操作的原理: 每个元素的哈希值在哪里。有人知道这些来自哪里吗?(也就是说,是否有任何特定的原因来选择这些数字?)还是只是简单地任意选择了它们? 这是来自官方CPython实现的代码片段, 以及Python中的等效实现: 问题答案: 除非Raymond Hetti

  • 主要内容:哈希表是什么,哈希查找算法哈希查找算法又称 散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1)。 哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列中查找目标元素。讲解哈希查找算法之前,我们首先要搞清楚什么是哈希表。 哈希表是什么 哈希表(Hash table)又称 散列表,是一种存储结构,通常用来存储多个元素。 和其它存储结构(线性表、树等)

  • 问题内容: 我必须对指纹文件进行匹配才能匹配双峰。在2013年,对Java有何建议?我是否还应该比较文件大小,或者这是不必要的检查? 误报的可能性应该非常接近0 编辑:很多答案,谢谢。如今备份软件的标准是什么?SHA-256?更高?我猜md5不合适吗? 问题答案: 如果假阳性的概率必须 为零 ,而不是“比闪电击中的概率低”,则完全不能使用哈希算法;您必须逐字节比较文件。 值得一提的是,如果您可以使

  • 本文向大家介绍一致性哈希算法?相关面试题,主要包含被问及一致性哈希算法?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 一致性哈希算法在1997年由麻省理工学院提出,设计目标是为了解决因特网中的热点(Hot pot)问题,初衷和CARP(缓冲阵列路由协议,Cache Array Routing Protocol)十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT(D

  • 你需要在这个练习中实现下面这三个哈希函数: FNV-1a 以创造者Glenn Fowler、Phong Vo 和 Landon Curt Noll的名字命名。这个算法产生合理的数值并且相当快。 Adler-32 以Mark Adler命名。一个比较糟糕的算法,但是由来已久并且适于学习。 DJB Hash 由Dan J. Bernstein (DJB)发明的哈希算法,但是难以找到这个算法的讨论。它非

  • 一致性哈希算法 tencent2012笔试题附加题 问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。 已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与S