计算hash值的方法:

对于key的hashCode做hash操作,无符号右移16位然后做异或运算。
还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。
集合中的初始化容量(必须是二的n次幂)

//默认的初始容量是16 -- 1<<4相当于1*2的4次方---1*16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
 static final int hash(Object key) {int h;/*1)如果key等于null:可以看到当key等于null的时候也是有哈希值的,返回的是0.2)如果key不等于null:首先计算出key的hashCode赋值给h,然后与h无符号右移16位后的二进制进行按位异或得到最后的hash值*/return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

计算过程如下所示:

说明:1)key.hashCode();返回散列值也就是hashcode。假设随便生成的一个值。2)n表示数组初始化的长度是163)&(按位与运算):运算规则:相同的二进制数位上,都是1的时候,结果为1,否则为零。4)^(按位异或运算):运算规则:相同的二进制数位上,数字相同,结果为0,不同为1。


简单来说就是:

  • 高16 bit 不变,低16 bit 和高16 bit 做了一个异或(得到的 hashcode 转化为32位二进制,前16位和后16位低16 bit和高16 bit做了一个异或)
  • (n-1) & hash = -> 得到下标 (n-1) n表示数组长度16,n-1就是15
  • 取余数本质是不断做除法,把剩余的数减去,运算效率要比位运算低。

计算hash值的方法相关推荐

  1. ora hash oracle官网,oracle计算hash值

    oracle计算hash值 1.dbms_utility.get_hash_value( name VARCHAR2, base NUMBER, hash_size NUMBER ) 函数说明 nam ...

  2. c++计算hash值

    c++计算hash值 #include "stdafx.h" #include <Windows.h>void ShowError(char *pszText) {ch ...

  3. 快速改变文件hash值的方法

    查看哈希值命令 Linux : md5sum + 文件名 $ md5sum 1.png fe5c3f5ef1d207bc1b646911b463c907 1.png Windows : certuti ...

  4. 通过java计算hash值

    通过java计算hashcode 前段时间,在分享hive分桶原理的时候,需要解释hive利用hashcode来将数据存储到不同的桶中,为了方便演示,本打算连hive,直接操作hive表计算hash值 ...

  5. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

  6. Java中一种计算Hash值的算法——SHA-256

    SHA-256:一种哈希函数 对于任意长度的消息,SHA-256都会产生一个256bit长的哈希值,称作消息摘要.这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示. ...

  7. JavaScript计算文件Hash值(sha1 sha 256 md5)

    一.引入外部库CryptoJS(简单) 1.字符串Hash <!DOCTYPE html> <html> <head><title>Hash算法< ...

  8. 存储 dict 的元素前是计算 key 的 hash 值?

    dict 的高性能与其存储方式是分不开的,我们知道 dict 的存储是基于哈希表(又称散列表),需要计算 hash 值,那么是计算谁的 hash 值呢?是像别人说的:存储 dict 元素前计算 key ...

  9. 【转】Java计算文件的hash值

    原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110 如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件has ...

最新文章

  1. 2021年码农应该了解的所有机器学习算法
  2. 一个学机械的毕业生令中国人无法安眠的帖子
  3. php从ftp下载文件到本地,php使用ftp实现文件上传与下载功能
  4. 行转列 oracle nvl,oracle 行转列 decode
  5. java1.6 linux_linux java1.6 安装
  6. Java基础复习笔记系列 九 网络编程
  7. java用i/o查看文件_Java文件I / O基础
  8. SQL Server类型与C#类型对应关系
  9. Excel .net读取
  10. Multisim14.0的详细安装步骤
  11. c++strcmp函数
  12. SPI通信调试(ADXL362)
  13. 刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
  14. STATA画图命令(一)
  15. HTML5软件设计大赛,我院成功举行第十七届山东省大学生软件设计大赛 HTML5创意应用命题决赛...
  16. 秦嘉哲:12.13黄金原油欧盘操作计划、黄金原油最新分析及策略布局
  17. 页面可视化搭建工具业界的轮子
  18. 如何退出UC浏览器登录账号
  19. 深信服2018年实习生校园招聘总结
  20. 手机端微信突然弹出电脑端已登录,是什么原因?

热门文章

  1. iphone X 的屏幕适配(简单版)
  2. 通过木块砌墙题目体会动态规划算法
  3. 10进制计数器Verilog编程
  4. STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
  5. 仿网易邮箱5.0(三):panel.js
  6. 《STM32从零开始学习历程》——I2C固件库
  7. 微信小程序:手机号码解析失败解决方案
  8. 无法往开启kerberos的zookeeper上注册服务_《坦克世界》不删档测试开启公告——测试服玩家福利原来在这里...
  9. 2021-06-15电子工艺实习报告——HX-6B收音机
  10. 华瑞IT教育|校园成人礼满满的青春味