什么是哈希码(HashCode)
[size=medium;] 在Java中,哈希码代表对象的特征。
例如对象 String str1 = “aa”, str1.hashCode= 3104 String str2 = “bb”, str2.hashCode= 3106 String str3 = “aa”, str3.hashCode= 3104
根据HashCode由此可得出str1!=str2,str1==str3 哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,
让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
下面给出几个常用的哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。[/size]
[size=medium;]equals方法在hibernate中的应用。
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个不同的对象。这与我们假设的出了矛盾。
因此,我们将覆盖User的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方法。
为什么不按主键来判断
因为主键是在插入数据进数据库之后才产生的,在一个对象还没有被持久化的时候,它是没有主键的,所以hibernate无法根据主键判断它是否有相同数据。
equlas和HashCode的关系
在hibernate中,它认为2个对象只要equlas返回true,那么hashCode一定相等。
但是实际情况呢? User u1 = new User(“张三”); User u2 = new User(“张三”);
由于我们重写了User的equlas方法,所以 u1.equlas(u2);返回true 但是,User并没有重写hashCode方法,
它用的是Object类的hashCode方法,所以 u1.hashCode = 31050006 u2.hashCode = 31587890 两者的hashCode并不相等。
违背了hibernate的原则 由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写User 的hashCode方法。如何重写hashCode方法呢?
HashCode的重写
如第2节所讲,哈希码要完成这么一件事,
首先要保证如果equlas出来的结果相等,那么hashCode也相等。像上面的u1和u2,由于名字都是“张三”,
所以应该返回相同的hashCode。所以我们可以想一个办法。让User的哈希码返回User里面name字段的哈希码,
这样就保证,名字相同的人,不但equlas方法相同,而且hashCode相等。 那么User类就变成
public class User
{
private String userName; //覆盖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;
}
}
//覆盖Object里的hashCode方法
public int hashCode() {
return name.hashCode();//返回名字的哈希码。
}
} 这样可以保证hibernate根据我们自己的需求来判断重复对象[/size]
分享到:
相关推荐
在IT领域,哈希码(Hash Code)是一种用于表示数据唯一性的编码,广泛应用于软件开发、数据校验、存储和查找等场景。本资源“文件哈希码生成工具.zip”包含了一个C#编写的源码项目,可用于快速计算文件的哈希值。...
很多密码都是哈希后保存的,由于哈希码由不可逆的函数生成,我们没有办法直接解密。如果要快速破解这类码值,综合使用多种资源……
标题中的“用于快速图像检索的二进制哈希码的深度学习_ C++代码_下载”揭示了这个项目是关于利用深度学习技术生成二进制哈希码,以实现高效图像检索的应用。在这个领域,深度学习被用来学习图像的特征表示,而二进制...
数组反转会改变数组元素的顺序,从而影响数组的哈希码。在实际开发中,如果需要保持数组的哈希码不变,应避免对数组进行反转操作,或者在必要时重新计算哈希码。本文提供的代码示例展示了如何在不同编程语言中实现...
Python hashlib库/模块使用方法的基础演示,包含字符串和文件的md5和sha256哈希码。
该方法利用CUDA架构的GPU单指令多线程特点,实现了并行迭代运算和遍历哈希链上的优势,从而提高了哈希密码破解的效率。 Knowledge Point 1: 哈希函数(Hash Function) 哈希函数是一种单向散列函数,将任意长度的...
1. **初始化哈希值**:算法开始时,会设置8个32位的初始哈希值(也称为中间哈希或工作向量)。 2. **预处理**:输入数据首先进行填充,确保其长度是512位的整数倍。填充方式是在原始数据末尾添加一个比特“1”,...
哈希码破解利器说明
哈希函数的最大特点是不可逆性,即哈希密码的解密是不可以使用一个特定函数反算出来的,因此获取哈希密码解密的方法只可能有2种方式:穷举暴力破解法和查表法
综上所述,"ImageHash:图像哈希码生成器"是一个强大的Java工具,它简化了图像哈希码的生成和比较过程,为开发者在处理图像问题时提供了便利。理解并熟练运用ImageHash库,能有效提升项目中的图像处理能力。
哈希密码转换微信密码加密小程序源码.zip
"cpp-parallelxxhash"项目就是这样一个工具,它允许我们并行计算多个key的XXHash哈希码,尤其适用于多核处理器的环境。 本文将详细介绍如何使用cpp-parallelxxhash库,并深入探讨并行计算在XXHash中的应用,以及它...
文件哈希码计算插件,解压出来之后执行脚本,可以集成到windows系统中,查看文件属性时,多出一个hashtab的tab页,可以对比文件、哈希值、检查文件的哈希值,保证文件的完整和安全,支持的算法包括:CRC、MD5、SHA1...
这种输出值称为哈希值或哈希码。哈希的主要目的是快速定位数据和高效存储数据。哈希值通常用于验证数据的完整性和一致性。 #### 1.2 哈希函数 哈希函数是实现哈希的核心,它接收任何长度的数据作为输入,并生成固定...
哈希密码破解(HashKracker) 恢复和破解多种hash的工具 你可以使用这个工具来恢复密码的MD5,SHA1,SHA256,SHA384,SHA512的,如流行的散列类型。 它使用基于字典破解方法使破解操作简单,容易。
哈希码(HashCode)在IT领域中扮演着重要的角色,特别是在数据结构和算法的设计与实现中。2021年,哈希码的概念和技术依然被广泛应用于各种编程语言和应用场景中。哈希码是一个整数值,它代表了一个对象在内存中的...
内含: 1.Struts2漏洞检查工具2017版 2.wwwscan网站备份扫描 3.火狐渗透专版,带渗透插件 4.burp1.7.36破解版 5.hashcat哈希密码破解工具