什么是哈希码(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]
分享到:
相关推荐
很多密码都是哈希后保存的,由于哈希码由不可逆的函数生成,我们没有办法直接解密。如果要快速破解这类码值,综合使用多种资源……
Caffe-cvprw15 用于快速图像检索的二进制哈希码的深度学习 不同哈希方法在 CIFAR10 数据集上的性能比较。该表显示了前 1000 个返回图像相对于不同哈希位数的平均精度 (mAP)。
Python hashlib库/模块使用方法的基础演示,包含字符串和文件的md5和sha256哈希码。
哈希密码破解(HashKracker) 恢复和破解多种hash的工具 你可以使用这个工具来恢复密码的MD5,SHA1,SHA256,SHA384,SHA512的,如流行的散列类型。 它使用基于字典破解方法使破解操作简单,容易。
C#开发,含源码,可根据实际需要而改动代码,编译成自己定制的工具。工具代替人,效率会提高很多,且工具在于反复使用,用得越多,创造的价值越多,需要的请拿去!
哈希码破解利器说明
哈希函数的最大特点是不可逆性,即哈希密码的解密是不可以使用一个特定函数反算出来的,因此获取哈希密码解密的方法只可能有2种方式:穷举暴力破解法和查表法
SHA256 哈希密码算法C语言实现 亲测好用。只要SHA256的实现。
哈希密码转换微信密码加密小程序源码.zip
文件哈希码计算插件,解压出来之后执行脚本,可以集成到windows系统中,查看文件属性时,多出一个hashtab的tab页,可以对比文件、哈希值、检查文件的哈希值,保证文件的完整和安全,支持的算法包括:CRC、MD5、SHA1...
基于GPU加速的彩虹表分析MD5哈希密码.pdf
parallel-xxhash 并行计算8个keys的xxHash哈希码
利用监督信息构造哈希函数,将多特征映射为低维哈希码;根据设计的自适应权重计算图像相似度,并返回相似的肺结节图像。实验结果表明,该方法能有效地实现肺结节CT图像的快速检索,对查询病灶的良恶性分类精度达到了...
内含: 1.Struts2漏洞检查工具2017版 2.wwwscan网站备份扫描 3.火狐渗透专版,带渗透插件 4.burp1.7.36破解版 5.hashcat哈希密码破解工具
到底MD5(哈希值)码有什么用处呢? 有了MD5码,您便可以知道您所下载的文件是否完整无缺,这对下载大型档案尤其重要! 使用: 文件下载后,使用MD5码验证工具算出文件的MD5码,并与网站提供的MD5码对照看是否一样...
支持CRC32、MD5、SHA1、SHA2、SHA3及SM3算法,支持文本、HEX字串和文件方式输入消息数据
哈希码_2021 回购哈希码2021。
开发了一个基于深度监督的离散哈希算法,假设学习的二进制代码应该是分类的理想选择,成对标签信息和分类信息在一个框架内用于学习哈希码,将最后一层的输出直接限制为二进制代码。由于哈希码的离散性质,使用交替...