我想知道 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/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o