基于按位与的 就散策略_比较散列策略

基于按位与的 就散策略

总览

编年史有很多用于哈希的实现,包括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

注意: Vanilla Hash种子是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/337411.shtml

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

相关文章

js实现数组降维算法[不准用Array.prototype.flat的api]

js实现数组降维算法[不准用Array.prototype.flat的api]// target要降维的元素&#xff0c;n降维阶数&#xff0c;newArr存储结果的新数组 function f(target, n 1, newArr []) {if (n < 0) {newArr.push(target);return;}if (!Array.isArray(target)) {newArr.push(target…

python编程能力等级测试_青少年编程能力等级测评-Python编程二级试卷

青少年编程能力等级测评 Python 编程二级试卷 一、单项选择题&#xff08;共 20 题&#xff0c;每题分&#xff0c;共 50 分&#xff09; 1. 运行下方代码段&#xff0c;输出的结果是&#xff08; &#xff09; 。 a() print(type(a)) A &#xff0e;&#xff1b; B &#xff0…

MySQL夺命16问,你能坚持到第几问?

点击蓝字关注我们1、数据库三大范式是什么&#xff1f;第一范式&#xff1a;每个列都不可以再拆分。第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。第三范式&#xff1a;在第二范式的基础上&#xff0c;非…

美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)

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

js箭头函数和普通函数区别

js箭头函数和普通函数区别实验环境&#xff1a;nodejs v12.16.1 箭头函数不能作为构造函数&#xff0c;而普通函数可以 箭头函数没有原型&#xff0c;而普通函数有 箭头函数return可以省略语句块。(如果>右边不是语句块&#xff0c;则代表return右边的表达式或对象) 箭…

git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)

该文章用于记录一些GitLab的使用指南&#xff0c;以及在实际版本控制过程中遇到的问题及解决方法&#xff0c;会尽量及时的更新~GitLab简介&#xff1a;GitLab和GitHub很相似都属于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来…

记一次开发实战-对提供接口的C/C++进行二次开发

点击蓝字关注我们一、需求描述我有一个USB5538的库和头文件&#xff0c;并通过头文件提供了接口&#xff0c;我想把它更改一下&#xff0c;编译成python可调用的模块。二、创建工程及其目录1、创建空项目2、创建目录三、创建文件1、复制文件并添加2、添加新文件并写入四、环境配…

C++是如何实现多态的

C是如何实现多态的结论&#xff1a;C通过虚函数来实现多态的&#xff0c;根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点&#xff1a; 存在继承关系基类存在虚函数&#xff0c;且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象&…

python回声程序 一行代码_python实现的比较完成的带声音的摩斯码翻译程序的代码...

将写代码过程较好的一些代码段做个珍藏&#xff0c;如下代码段是关于python实现的比较完成的带声音的摩斯码翻译程序的代码&#xff0c;希望能对各朋友有所用处。 import pygame import time import sys CODE {A: .-, B: -..., C: -.-., D: -.., E: ., F: ..-., G…

jooq 生成数据库_jOOQ类型安全数据库查询教程

jooq 生成数据库课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自JDBC以来&#xff0c;几乎没有采取任何相关措施来更好地将SQL集成到Java中。 …

C语言实现通讯录附详细代码(动态+静态)

点击蓝字关注我们一、通讯录简介实现一个通讯录&#xff1b;通讯录可以用来存储1000个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址提供方法&#xff1a;添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系…

Lua协程Coroutine是什么

Lua协程Coroutine是什么协程和线程不同&#xff1a; 同一时刻&#xff0c;一个多线程程序可以用多个线程同时执行&#xff1b;而协程只能有一个在执行多线程是抢占式的&#xff1b;而协程是非抢占式的&#xff0c;只有协程显示被挂起&#xff0c;才会被挂起 协程和线程的相同…

请使用复选框选择_使用可选是可选的

请使用复选框选择在上周“收藏中的可选内容”的文章发表之后&#xff0c;我不禁要多讲一些关于同一只野兽的事情。 更多细节。 最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲&#xff…

python爬去百度图片_python实现爬取百度图片的方法示例

本文实例讲述了python实现爬取百度图片的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; import json import itertools import urllib import requests import os import re import sys wordinput("请输入关键字&#xff1a;") path"./ok" …

C++程序的内存分区模型-栈区堆区

点击蓝字关注我们1、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等&#xff08;由编译器管理其“生死”&#xff09;注意事项&#xff1a;不要返回局部变量的地址&#xff0c;栈区开辟的数据由编译器自动释放栈区代码演示&#xff…

CocosStudio的节点如何使用自定义shader

CocosStudio的节点如何使用自定义shader问题&#xff1a;我想对CocosStudio 的 某个UI 里的 某个图片&#xff08;如下图所示的Image类型&#xff09;使用自定义shader。但是&#xff0c;我把 对传统的cc.Sprite应用自定义shader的方式 应用于它时&#xff0c;并不生效&#xf…

concurrency_Java Concurrency Essentials教程

concurrency课程大纲 并发一直是开发人员面临的挑战&#xff0c;编写并发程序可能非常困难。 引入并发性时&#xff0c;可能会发生很多事情&#xff0c;并且系统的复杂性会大大增加。 但是&#xff0c;编写健壮的并发程序的能力是开发人员的必备工具&#xff0c;并且可以帮助构…

excel随机抽取_简单随机抽样及其进阶分层随机抽样方法展示

一、分享简单随机抽样的几种方法1、抽样分析工具抽样2、INDIRECTRANDBETWEEN函数抽样3、RAND排序抽样4、SAS抽样二、分层抽样方法1、Python分层抽样2、SAS分层抽样3、EXCEL函数及功能分层抽样简单随机抽样的几种方法方法一抽样分析工具抽样如果你的EXCEL尚未安装数据分析&#…

为什么存在动态内存分配,动态内存函数(malloc函数,free函数,calloc函数,realloc函数)...

点击蓝字关注我们1.当前我们知道的内存的使用方法2.为什么存在动态内存分配如上我们已学的开辟空间的方式有两个特点&#xff1a;空间开辟的大小是固定的必须指定数组的长度所以就产生了空间开大了浪费开小了不够用的问题&#xff0c;所以使用动态内存分配3.动态内存函数&#…

论游戏项目中的左与右

标题《论游戏项目中的左与右》 何为左与右&#xff1f;左&#xff0c;左倾&#xff0c;即 激进主义&#xff0c;冒险主义&#xff0c;盲动主义。右&#xff0c;右倾&#xff0c;即 消极主义&#xff0c;保守主义&#xff0c;投降主义。 &#xff08;一&#xff09;先说说关于…