学习笔记40-哈希码(HashCode)
哈希码
哈希码是一种算法,它的目的是让同一个类的对象按照自己不同的特征尽量地有不同的哈希码,但是,不表示不同的对象哈希码完全不同。也可能有相同的情况。在Java中,哈希码代表对象的特征。
hashCode
在Java中,hashCode是jdk根据对象的地址或者字符串或者是数字算出来的int类型的数值。
常见的哈希码的算法有:
1:Object类的hashCode :返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode :根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类 :返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。
equal
equals方法是默认的判断2个对象是否相等的方法,在Object类里有实现,判断的是2个对象的内存地址。在hibernate中,不允许存在同类对象中有2个一样的实例。hibernate通过equals方法做判断。如:
User u1 = new User(“张三”);
User u2 = new User(“李四”);
User u3 = new User(“张三”);
按照项目需求,用户只要名字相同,就表示同一个用户,所以我们认为,u1和u3是同一个人,同一个对象。但是因为u1,u2,u3三者的内存地址都各不相同,所以hibernate会认为这是3个不同的对象。这与我们假设的出了矛盾。 因此,我们将覆盖Object类中的equals方法。
public class User
{private String userName;
//get ,set方法省
//覆盖Object里的equals方法
public boolean equals(Object arg0)
{if (!(arg0 instanceof User)){return false;}User user = (User)arg0;//如果名字相同,则表示属于同一个对象。if(user.getName().equals(this.getName)){return true;}else{return false; }
}
这样hibernate在插入数据的时候,如果传过来一个叫”张三”的用户,hibernate会先判断有没有叫“张三”的用户,如果没有,就允许插入,如果有,就不允许插入。这样做可以保证数据的高度一致性,不同的项目有不同的需求,所以要根据自己的需求来覆盖equals方法。
哈希学习
哈希学习的目的:
通过机器学习机制将数据映射成简洁的二进制串的形式,同时使得哈希码尽可能地保持原空间中的近邻关系,即保相似性。
比如下面的例子:
原始数据是三幅图像,其中后面这两幅相似度比较高,也就是说在原始空间中从语义层次的距离或者欧氏距离都比较近,映射为哈希码之后,距离也应该更近。
哈希学习的分类:
- 第一种的代表是局部敏感哈希,这种方法主要是人工设计或者随机生成哈希函数,是一种数据独立的方法;
- 第二种是哈希学习的方法,希望从数据中自动学习出哈希函数,是一种数据依赖的方法;也是现在主流的方法;
显然第二种具有数据依赖性,是一种更有适应性的方法。
哈希学习的步骤:
- 先对原空间的样本进行降维, 得到1个低维空间的实数向量表示;
- 对得到的实数向量进行量化(即离散化)得到二进制哈希码;
量化方法:
SBQ:对于给出向量的每一个维度的数值,我们设定一个阈值。然后根据这个维度数值的情况与阈值作比较,确定其映射的二进制数是2还是1。之后我们把每个维度映射出的二进制数串起来组成哈希码。
比如某一向量为[4,3,7,8],我们设定阈值为5,并且>=5为1,反之为0.
那么该向量对应的二进制哈希码为0011.HQ:跟SBQ比较类似,是将每一个维度划分为四个区域,使用三个阈值和两位二进制码来编码。
比如一个向量为[4,3,7,8],我们设定三个阈值,2.5, 4.5, 6.5。可以把一个维度分成四个区域,每个区域分别用两位二进制码表示:00,01,10,11
那么上面的变量对应的哈希码是01011111
学习笔记40-哈希码(HashCode)相关推荐
- JUC.Condition学习笔记[附详细源码解析]
JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...
- K8s基础知识学习笔记及部分源码剖析
K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...
- 源码 状态机_LLVM学习笔记(1)--初探源码
一直耳闻LLVM相比于GCC: well documented 架构灵活,前后端解耦符合龙书的讲解 昨天读到了一篇虽然概括却很周到的llvm入门导引 陈钦霖:LLVM Pass入门导引zhuanla ...
- Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)
在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...
- 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】
深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...
- Netty学习笔记 - 1 (带源码分析部分)
2021年12月 北京 xxd 一.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用 ...
- The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译
前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部件.由于部分包在墙外,带来了一点麻烦,还分享一个 replace 方式来翻墙的办法. 小能手这段时间在学习 The Things ...
- The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译 - 190821
文章目录 前言 1 依赖包替换 2 编译准备 3 编译 3.1 cli 编译 3.2 stack 编译 3.3 前端编译 END 前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部 ...
- jMetal学习笔记(二)-NSGAii源码解读
前言 上篇笔记根据使用手册介绍了jMetal的架构,但是由于使用手册撰写时间太早(最近更新时间是08年),现在jmetal框架更新了,所以很多都已经不适用,这篇笔记会穿插讲解jmetal架构知识. 其 ...
- 李宏毅学习笔记40.GAN.番外篇
文章目录 简介 Recap Self-attention GAN(SAGAN) Self-attention Spectral normalization (SN) Two-Timescale Upd ...
最新文章
- 谷歌魔改Transformer登NeurIPS 2021!一层8个token更好用
- linux 手动添加 swap 分区
- C++ 模板:template
- Android --- 按钮控件设置与不设置背景都会有一个小小的灰色阴影怎么去掉?
- 小记:再谈单例模式静态类区别优势
- Java代码格式化算法_一个时间格式化的工具类:TimeUtil
- Leetcode-1155 Number of Dice Rolls With Target Sum(掷骰子的N种方法)
- 算法:找出存在子字符串的最先位置28. Implement strStr()
- android viewflipper图片轮播,ViewFlipper探索与使用——顺便实现Android图片轮播
- 小甲鱼Python第二十八讲(文件)
- Selenium2_如何判断WebElement元素对象是否存在
- 《概率论与数理统计》速成
- 【晒出你的第83行代码】社区用户@尼古拉斯雷的代码故事,和现在比起来以前的代码都是垃圾!...
- library(igraph)
- 煤气炉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- oracle -解锁scott用户
- BNUOJ 26474 Bread Sorting
- 推荐几个不错的DOTNET控件网址
- 橄榄油可以用来炒菜吗
- Java生成PDF文件并使用指定的模板,带图片