比较散列策略

总览

编年史有许多用于哈希的实现,包括City和Murmur。 它也有自己的香草哈希,但是如何进行测试?

什么是香草哈希?

Vanilla Hash设计得尽可能简单,并且针对Orthogonal Bits测试进行了优化(请参见下文),并与City 1.1和Murmur 3哈希策略进行了比较。

这是用新数据填充64字节/ 256字节缓冲区并生成64位哈希值的99%延迟。 JMH用于执行测量。 请参阅Main64bytes和Main256bytes

散列,策略 64字节99%瓦片 256字节99%瓦片
香草 67 ns 112毫微秒
城市1.1 90纳秒 182 ns
杂音3 104毫微秒 211 ns

  • 完整的测试结果在这里。

您可以执行哪些测试来检查哈希策略是否良好?

您可以执行许多简单的测试。 测试无法识别出良好的哈希,但可以将哈希显示为不良哈希。 通过一项测试可能意味着它将无法通过另一项测试。

在每种情况下,都使用不同的随机起点运行多个测试。 分数为第99%,即最差的1%。 这是因为您不需要在某些时间或平均情况下有效的哈希。 您需要一种大多数情况下都可以使用的产品。 (在所有情况下,您都可以发明任何特定散列都将分解的病理情况)

为了保持一致性,分数越低越好。 测试的构造应使得分为0表示测试已损坏。

在每个测试中,使用8,192位或1024 KB的输入,一次切换一位。 根据这些输入,将生成8,192 x 64位哈希。

但是,对于随机测试,采用了一系列随机的64位值。 这些对于了解所测试的散列策略有多少是有用的。

哈希表掩码

在此测试中,每个哈希的模数为16,384(哈希数的两倍),并且报告了冲突数。 大多数哈希策略在此测试中效果很好。

雪崩分数

在此测试中,将每个散列与前一个散列(前一位进行切换)进行比较,以查看任何给定位被翻转的可能性。 理想值为50%,与50%的差异之和为报告的最差1%。

延迟速度

在此测试中,记录了执行哈希所需的时间,并报告了最差的1%延迟。

正交钻头

该测试的目的是确保所有哈希具有的位与生成的其他所有哈希均尽可能不同。 除了64位数字外,请考虑8个皇后问题。 理想的情况是每个数字都具有与其他每个数字不同的相同位数,并且位数应尽可能高。

在此测试中,将每个哈希与每个其他哈希进行比较。 对不同的位数进行计数。 如果不同位数小于18,则给出2 ^(17-n)的惩罚分数。 位数越少,则指数级的惩罚越大。 如果映射到其他8K哈希值的任何8K哈希值的差异小于5位,则即使所有其他对都很好,这也是失败的。

我称其为正交位测试,因为您可以将64位数字建模为64位的位向量。 理想情况下,您希望产生的所有散列之间的角度尽可能大。

在所有测试中,此测试显示具有HashMap.hash(int)的String.hashCode()与其他哈希策略之间的最大差异。

测试String.hashCode()

String.hashCode()是一个非常差的哈希,尤其是对于低位 。 它是标准的,不能更改或破坏向后兼容性。 但是,这不一定是问题,因为HashMap使用agitate函数,该函数会降低一些较高的位以随机化较低的位。

int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);
}

结果

CheckMain类对每种哈希策略运行一套测试。

VANILLA
Orthogonal bits: 99%tile score: 6066
Speed: The 99%tile for latency was 0.223 us
Avalanche: The 99%tile of the drift from 50% was 0.55%
Mask of Hash: 99%tile collisions: 1815CITY_1_1
Orthogonal bits: 99%tile score: 7395
Speed: The 99%tile for latency was 0.267 us
Avalanche: The 99%tile of the drift from 50% was 0.55%
Mask of Hash: 99%tile collisions: 1817MURMUR_3
Orthogonal bits: 99%tile score: 7524
Speed: The 99%tile for latency was 0.378 us
Avalanche: The 99%tile of the drift from 50% was 0.54%
Mask of Hash: 99%tile collisions: 1815STRING32
Orthogonal bits: 99%tile score: 295906433
Speed: The 99%tile for latency was 1.580 us
Avalanche: The 99%tile of the drift from 50% was 1.02%
Mask of Hash: 99%tile collisions: 1814STRING64
Orthogonal bits: 99%tile score: 1939167
Speed: The 99%tile for latency was 1.520 us
Avalanche: The 99%tile of the drift from 50% was 0.61%
Mask of Hash: 99%tile collisions: 1816STRING32_WITHOUT_AGITATE
Orthogonal bits: 99%tile score: 879390386
Speed: The 99%tile for latency was 1.573 us
Avalanche: The 99%tile of the drift from 50% was 3.53%
Mask of Hash: 99%tile collisions: 6593RANDOM
Orthogonal bits: 99%tile score: 7444
Speed: The 99%tile for latency was 0.058 us
Avalanche: The 99%tile of the drift from 50% was 0.53%
Mask of Hash: 99%tile collisions: 1817SECURE_RANDOM
Orthogonal bits: 99%tile score: 7449
Speed: The 99%tile for latency was 0.861 us
Avalanche: The 99%tile of the drift from 50% was 0.54%
Mask of Hash: 99%tile collisions: 1816SEEDED_VANILLA
Orthogonal bits: 99%tile score: 6000
Speed: The 99%tile for latency was 0.219 us
Avalanche: The 99%tile of the drift from 50% was 0.55%
Mask of Hash: 99%tile collisions: 1814SEEDED_CITY_1_1
Orthogonal bits: 99%tile score: 7313
Speed: The 99%tile for latency was 0.270 us
Avalanche: The 99%tile of the drift from 50% was 0.54%
Mask of Hash: 99%tile collisions: 1813SEEDED_MURMUR_3
Orthogonal bits: 99%tile score: 7404
Speed: The 99%tile for latency was 0.359 us
Avalanche: The 99%tile of the drift from 50% was 0.53%
Mask of Hash: 99%tile collisions: 1810

注意:香草杂种种子是Chronicle Enterprise的一部分

结论

Vanilla,City和Murmur哈希是最快的。

尽管String.hashCode()很简单,但每个字符的乘法运算却很昂贵。 相比之下,所有其他字节使用long一次处理8个字节。 与STRING32相比,请参阅STRINGS32_WITHOUT_AGITATE。 HashMap使用更高版本。

即使在avalanche测试中,带有搅动的32位String hashCode()也表现不佳。 在SMHasher中,该测试的得分超过1%被视为失败。

哈希掩码测试虽然简单,但在所有情况下都表现良好。 例外是String.hashCode(),如上所述,它没有非常随机的低位。

我发现有趣的是,正交测试得分有何不同。 前三个哈希策略再次持续较低。 甚至String.hashCode()的64位版本在产生散列方面也有很大的变化,只有不到18位的不同,实际上很多位是相同的。

免责声明

香草哈希已针对正交钻头测试进行了优化。 因此,获得更好的结果也就不足为奇了。 这并不意味着Vanilla Hash比City或Murmur好。 这可能仅表示对“正交位”测试最好。

翻译自: https://www.javacodegeeks.com/2015/08/comparing-hashing-strategies.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

心脏滴血漏洞详解及利用--HeartBleed With OpenSSL

【事件规则】 OpenSSL“心脏出血”漏洞是一个非常严重的问题。这个漏洞使攻击者能够从内存中读取多达64 KB的数据。也就是说,只要有这个漏洞的存在,在无需任何特权信息或身份验证的环境下,我们就可以从我们自己的(测试机上&#…

npm ERR! the command again as root/Administrator

以管理员身份运行。 顺便测试一下git bash和cmd安装nmp intall,测试他们之间的关系,发现git bash应该比cmd命令更丰富一点,推荐使用git bash.

Nmap常用命令

1、扫描单个目标地址: Nmap 192.168.128.30 2、扫描多个目标地: Nmap 192.168.128.130 192.168.128.129 3、扫描一个范围内的目标地址: Nmap 192.168.128.129-130 4、扫描目标地址所在的某个网段 Nmap 192.168.128.130/24 5、扫描主机列表1.t…

解决tableViewCell分割线不到左边界的问题

12345678910111213141516171819202122232425262728在tableView控制器的.m文件中任何位置加入以下两个方法即可解决/*** 下面两个方法解决cell分割线不到左边界的问题*/-(void)viewDidLayoutSubviews {if ([self.tableView respondsToSelector:selector(setSeparatorInset:)]) …

javaScript学习笔记总结(一)

javaScript教程 JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都使用 JavaScript。 JavaScript 一直在升级,所以我们需要时刻了解 JavaScript 的新技术。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>…

vaadin_Vaadin应用程序中的EJB查找

vaadin自从我实现上一个服务定位器以来已经有很长时间了。 考虑到Java EE CDI &#xff08;上下文和依赖注入&#xff09;的成熟度&#xff0c;我认为不再需要。 我的第一个实现是在基于Struts的Web应用程序中使用EJB。 之后&#xff0c;我开始使用JSF&#xff0c;它只需要带有…

host碰撞漏洞

一、host碰撞原理环境搭建 在虚拟机下搭建Nginx环境配置&#xff08;192.168.202.128&#xff09; 1. 设置一个server为ip访问时返回400 2. 设置一个sever为访问某个域名时

servlet中访问mysql无法包含中文的解决

最近写servlet应用发现&#xff0c;如果我的sql语句中包含英文&#xff0c;访问数据库就失败&#xff0c;而我数据库的编码是utf8 -- UTF-8 Unicode&#xff0c;而我servlet的字符也已经转为UTF-8 &#xff0c;还是不行。 后来多方打听&#xff0c;终于解决了这个问题&#xff…

uniapp框架之如何修改接口传参的参数

大家好&#xff0c;我是孙叫兽&#xff0c;uniapp技术交流群&#xff1a;1149933135 项目采用uniappuView开发&#xff1b; uiapp官方文档&#xff1a;https://uniapp.dcloud.io/ uview官方文档&#xff1a;http://uviewui.com/components/intro.html 谷歌浏览器扩展插件Header…

在Java 8中进行投射(还有其他功能?)

将实例转换为设计不良的类型。 尽管如此&#xff0c;在某些情况下没有其他选择。 从第一天开始&#xff0c;这种能力就已经成为Java的一部分。 我认为Java 8提出了对这种古老技术稍加改进的需求。 静态铸造 用Java进行转换的最常见方法如下&#xff1a; 静态铸造 Object ob…

windows查看文件的md5值

1、winr 输入cmd进入控制界面 2、certutil -hashfile XXXX md5(XXXX为绝对路径) Linux下查看文件md5值&#xff1a; 进入文件目录&#xff0c;使用md5sum加文件名&#xff0c;例如md5sum test.txt

mysql字符串分割函数(行转列)

由于工作需要需要处理一些以逗号分隔的字符串&#xff0c;每次都要现做很是麻烦&#xff0c;网上找了很多都没有现成的&#xff0c;好吧&#xff0c;自己动手写一个好了 1 CREATE DEFINER harri% FUNCTION str_for_substr(num int, str varchar(5000))2 RETURNS varchar(100)…

如何使用window.btoa base64对接口数组进行加密处理

大家好&#xff0c;我是孙叫兽&#xff0c;前端全栈工程师&#xff0c;uniapp技术交流群&#xff1a;1149933135 项目采用uniappuView开发&#xff1b; uiapp官方文档&#xff1a;https://uniapp.dcloud.io/ uview官方文档&#xff1a;http://uviewui.com/components/intro.htm…

值得收藏的40个黑客常用入侵端口总结

值得收藏的40个黑客常用入侵端口总结-安全-PHP中文网 常用端口&#xff1a; 21端口渗透剖析 FTP通常用作对远程服务器进行管理&#xff0c;典型应用就是对web系统进行管理。一旦FTP密码泄露就直接威胁web系统安全&#xff0c;甚至黑客通过提权可以直接控制服务器。这里剖析渗透…

csdn个人主页下如何添加微信公众号及超链接

本文以CSDN孙叫兽的博客为例。打开CSDN孙叫兽的博客主页。谷歌浏览器下找到这个页面的源代码&#xff0c;鼠标右键-检查&#xff0c;或者F12打开调试页面。第一步找选中图标&#xff0c;第二步选中目标区域&#xff0c;第三步找到对应的前端代码复制到本地文件&#xff08;选中…

2015-10-15 css3

图片模糊效果 <img id "img1" src"image/免费学PS.jpg" style"-webkit-filter: blur(5px)"> //webkit解决兼容问题一&#xff1a;特殊选择器 1. *可以匹配任何标记 2. >表示后面是前面的子元素 #d1 span //表示id为d1的div下面的…

proxy aspectj_使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍

proxy aspectj静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助。 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除。 代码注入对于处理涉及整个应用程序的问题&#xff08;例如性能监视&#xff09;也很有用…

gshark(github敏感信息搜集工具)

gshark 介绍&#xff1a;这是个可视化的监测工具&#xff0c;它不仅可以监控github&#xff0c;还可以监控gitlab‍ 所需环境&#xff1a; go64位gccLinux 一个github账号token&#xff0c;获取地址&#xff1a;https://github.com/settings/tokens 不建议使用window部署&a…

CSDN个人主页下如何添加微信公众号?

本人孙叫兽,前端全站程序员。微信公众号:电商程序员。 本文以CSDN孙叫兽的博客为例。 打开CSDN孙叫兽的博客主页。 谷歌浏览器下找到这个页面的源代码,鼠标右键-检查,或者F12打开调试页面。第一步找选中图标,第二步选中目标区域,第三步找到对应的前端代码复制到…