16进制如何取出分高位和低位_异或运算只具有两个输入逻辑变量

16进制如何取出分高位和低位_异或运算只具有两个输入逻辑变量为什么要先高16位异或低16位再取模运算

大家好,又见面了,我是你们的朋友全栈君。

我们知道,n代表的是table的长度length,之前一再强调,表table的长度需要取2的整数次幂,就是为了这里等价这里进行取模运算时的方便——取模运算转化成位运算公式:a%(2^n) 等价于 a&(2^n-1),而&操作比%操作具有更高的效率。
  当length=2n时,(length – 1)正好相当于一个”低位掩码”,”与”操作的结果就是散列值的高位全部归零,只保留低位,用来做数组下标访问:

16进制如何取出分高位和低位_异或运算只具有两个输入逻辑变量

可以看到,当我们的length为16的时候,哈希码(字符串“abcabcabcabcabc”的key对应的哈希码)对(16-1)与操作,对于多个key生成的hashCode,只要哈希码的后4位为0,不论不论高位怎么变化,最终的结果均为0。也就是说,如果支取后四位(低位)的话,这个时候产生”碰撞”的几率就非常大(当然&运算中产生碰撞的原因很多,这里只是举个例子)。为了解决低位与操作碰撞的问题,于是便有了第二步中高16位异或低16位的“扰动函数”。
右移16位,自己的高半区和低半区异或,就是为了混合原始哈希码的高位和低位,以此来加大低位随机性。

16进制如何取出分高位和低位_异或运算只具有两个输入逻辑变量

可以看到: 扰动函数优化前:1954974080 % 16 = 1954974080 & (16 – 1) = 0 扰动函数优化后:1955003654 % 16 = 1955003654 & (16 – 1) = 6 很显然,减少了碰撞的几率。

转载于:https://www.cnblogs.com/Profound/p/10879101.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106819.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信小程序:wx.getUserInfo 接口的变动与使用

    微信小程序:wx.getUserInfo 接口的变动与使用

    2022年4月3日
    138
  • LWIP使用解析_lwip tcp

    LWIP使用解析_lwip tcp1:环境STM32F407RT-thread2:结构体使用最上层:structrt_stm32_ethstructrt_stm32_eth{/*inheritfromethernetdevice*/structeth_deviceparent;/*interfaceaddressinfo,hwaddress*/rt_uint8_tdev_addr[MAX_ADDR_LEN];/*ETH_Speed*/

    2025年6月21日
    0
  • mysql和mongodb的区别是什么_mongodb和mysql的区别是什么?区别详细介绍

    mysql和mongodb的区别是什么_mongodb和mysql的区别是什么?区别详细介绍对于mongodb和mysql你应该都很清楚了吧,那么他们两个之间的区别你知道吗?很多人对于mongodb和mysql的区别都不是很清楚,下面一起来了解一下吧。一、mongodb和mysql的区别有哪些?对于这两者的区别,我们可以从以下的九个方面来谈一下。1、数据库模型mongodb-非关系型;mysql-关系型;2、存储方式mongodb-以类JSON的文档的格式存储;mysql-不同引擎有不同…

    2022年6月23日
    25
  • 运维架构体系搭建系列-目录篇[通俗易懂]

    运维架构体系搭建系列-目录篇[通俗易懂]前言:去年新加入的一家公司,传统企业这里就不说名字了,不过公司规模还是有的,鄙人来之前基本上用的都是saas产品,加上疫情原因,没及时跳坑,做为一个半吊子自动化运维开发当然是选择先混日子,后面等来了一个新的技术团队,开始做自己的系统和产品。一、云选型及网络规划1、云产品选型2、网络规划二、devops相关服务搭建1、cicd工具链搭建2、项目管理三、db&中间件1、数据库管理2、中间件管理四、k8s环境及微服务治理1、k8s选型及搭建2、mse管理五、监控&日志

    2022年7月17日
    13
  • Java数组(二维数组)「建议收藏」

    Java数组(二维数组)「建议收藏」目录前言多维数组二维数组声明二维数组创建二维数组访问二维数组遍历二维数组最后前言在上一篇文章Java数组(一维数组)中,我们学习了一维数组,那么今天我们来学习Java二维数组。多维数组数组元素除了可以是原始数据类型、对象类型之外,还可以是数组,即数组元素是数组,通过声明数组的数组来实现多维数组。多维数组的使用和二维数组使用相似,我们来介绍二维数组。二维数组声明二维数组声明二维数组语法有两种格式,例如:数组类型[][]数组名;

    2022年7月7日
    20
  • JLINK V9项目启动【jlink接口定义】【开启VCOM(虚拟串口)功能】「建议收藏」

    JLINK V9项目启动【jlink接口定义】【开启VCOM(虚拟串口)功能】「建议收藏」jlink接口定义摘录于:https://blog.csdn.net/u014124220/article/details/50829713仿真器端口 连接目标板 备注 1.VCC MCU电源VCC VCC 2.VCC MCU电源VCC VCC 3.TRST TRST Tes…

    2022年5月28日
    252

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号