Java hashCode() 方法

什么是 Hash

Hash 中文叫做哈希也可以叫做散列,使用 Hash 的算法生成字符串或者数字的方法就可以称为 Hash 算法,或者散列算法。

如果还不太明白的话,考虑下 MD5。MD5 就是典型的哈希算法,通过 MD5 算法,不管你是输入字符串,图片,二进制文件,都能获得一个字符串。

获得这个字符串的算法就是 Hash 算法。

为什么要 Hash

我们在这里不打算讨论复杂的 Hash 算法或者 Hash 算法怎么去计算的。因为这样的话,你可能需要很长的时间才能搞明白到底怎么算出来的。

使用 Hash 算法的目的就是为了将获得的数据摘要信息尽量分散,并且尽量的不重复,同时还需要保证相同数据的 Hash 结果是相同不能变化的。

不管你将相同数据 Hash 多少遍,只要数据相同,那么 Hash 必须是相同的。

哈希碰撞

在现实生活中,不同数据的 Hash 结果可能是相同的。

考察下面的代码:

logger.debug("HashCode AaAaAa - {}","AaAaAa".hashCode());logger.debug("HashCode BBAaBB - {}","BBAaBB".hashCode());

上面代码输出的结果是相同的,这种情况就是哈希碰撞( Hash collision)。




很遗憾,这种哈希碰撞在现实中是不能避免的。



常用的哈希算法

常用的 Hash 算法有下面的一些算法。

MD5 的算法已经不是安全的 Hash 算法了,在密码学和开发中,已经逐步推荐使用 SHA-256 算法了。

算法输出长度(位)输出长度(字节)

MD5128 bits16 bytes

SHA-1160 bits20 bytes

RipeMD-160160 bits20 bytes

SHA-256256 bits32 bytes

SHA-512512 bits64 bytes

根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。

Java 的 hashCode()

Java 中的 hashCode() 方法返回的数据类型是 int 类型。

下面以 String 对象的 hashCode 为例,官方解释中有关 String 对象 Hash 算法计算方式是:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

针对输入字符串是不是 UTF16,将会有不同的计算方法。




IntelliJ IDEA 重写 Hash 算法

如果你不想使用 Java Object 对象中的 Hash 算法,你可以在你的对象中重写 Hash 算法。

在 IntelliJ IDEA 输入快捷键 Alt+Insert,这个将会弹出快速生成方法的选择项。

随后将会提示你选用何种方法来创建 hashCode() 方法。你可以选择使用 JDK 自带的,你也可以选择使用 Apache Commons-lang 的方法来重写方法。当然,你也可以使用其他的一些方法来写,不管哪个方法来写,原理都是相通的。

选择变量,在完成上面的方法选择后,将会提示你选择变量。

将需要创建的变量选择,然后下一步。

同时还需要你选择非空的字段,你可以默认选择也可以不选择。

如下,你可以看到使用 JDK 生成的默认的 hashCode 方法。

@OverridepublicinthashCode(){returnObjects.hash(title, topic_id, raw, category, target_recipients, archetype, created_at);    }




如果你根据使用的是 Apache 的 Commons 生成的话,结果有所不同。

可以在 IDE 中自行研究下。

需要注意的是,在 hashCode 中,你可能会看到数字 17,31,37。

其实这些数字就是素数了,在 Java 面试的时候可能会有一道题目就是找出 100 以内的素数。

因为 Hash 算法在很多时候其实也可以用于密码学中,密码学的很多基础研究就是对素数的研究。

网络中广泛使用的RSA算法,就是基于素数性质的重要应用。

因此在 hashCode 的方法中,你能看到上面的数字,这个就是有关素数算法的实际应用之一。因为涉及到很多密码学的知识,我们这里就不实际展开了。

通过上面的说明,我们就能够在 Java 中对对象或者数据进行 Hash。

哈希算法和应用是 Java Hashmap 的基础,因此 hashCode 方法在 Java 中也会作为基础方法存在。

https://www.ossez.com/t/java-hashcode/13447

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容