首页 > 其他分享 >哈希碰撞

哈希碰撞

时间:2024-01-31 14:00:27浏览次数:16  
标签:name age 碰撞 hashCode Student 哈希 public

哈希碰撞是指两个不同的输入数据在经过哈希函数运算后产生相同的哈希值。哈希函数通常将输入数据映射到一个较小的范围,比如一个固定大小的哈希码空间,但输入数据的范围可能远远大于哈希码空间。因此,多个不同的输入可能映射到相同的哈希码,这就是哈希碰撞的发生。

哈希碰撞可能发生在任何使用哈希函数的场景,包括哈希表、哈希集合、哈希集映射等。在这些数据结构中,哈希函数用于将键(key)映射到索引或位置,以便快速查找或检索数据。

解决哈希碰撞的一些常见方法包括:

  1. 开放寻址法(Open Addressing): 当发生碰撞时,继续探查哈希表中的下一个位置,直到找到一个空槽或者满足特定条件的槽。

  2. 链地址法(Chaining): 每个哈希桶存储一个链表或其他数据结构,所有哈希到同一桶的元素都存储在链表中。

  3. 再哈希(Rehashing): 当哈希表的负载因子达到一定阈值时,对哈希表进行扩容,重新计算哈希码并重新分配元素,以减少碰撞的可能性。

  4. 良好设计的哈希函数: 使用高质量、均匀分布的哈希函数可以减少碰撞的发生。

哈希碰撞是不可避免

点击查看代码
package com.itheima.javase;

import java.util.Objects;

class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

public class HashCode {
    /**
     * 哈希值 就是一个int类型的数值,Java中每个对象都有一个哈希值。
     *
     * Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。
     *
     * 对象哈希值的特点
     *
     * 同一个对象多次调用hashCode()方法返回的哈希值是相同的。
     *
     * 不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。
     *
     * @param args
     */
    public static void main(String[] args) {
        Student s1 = new Student("张三", 25);
        Student s2 = new Student("张三", 25);
        Student s3 = new Student("李四", 25);

        System.out.println("s1.hashCode() = "+s1.hashCode());//s1.hashCode() = 24022545
        System.out.println("s2.hashCode() = "+s2.hashCode());//s2.hashCode() = 24022545
        System.out.println("s3.hashCode() = "+s2.hashCode());//s3.hashCode() = 24022545

        System.out.println(s1.hashCode() == s2.hashCode());//  true
        System.out.println(s1.hashCode() == s3.hashCode());// false



    }
}

标签:name,age,碰撞,hashCode,Student,哈希,public
From: https://www.cnblogs.com/itcq1024/p/17999114

相关文章

  • 哈希表
    哈希表实现#include<stdio.h>#include<stdlib.h>#include<string.h>#defineHASHTABLE_CAPACITY20//===File:array_hash_map.c===/*键值对int->string*/typedefstruct{ intkey; char*val;}Pair;typedefstruct{ void*set; intlen;......
  • 哈希学习笔记
    定义与基本求法定义:用于用一个进制数表示一个字符串,以方便存储和判断两字符串是否相等。基本求法:联系十进制,如\(1234\)即\(1\times10^3+2\times10^2+3\times10+4\)同样的对于一个字符串,去一个大于其中任意字符(\(\text{ASCII}\)码)的数\(base\)作为进制。也就有了......
  • 【板子】字符串哈希
    //lgp3370//Copyrightyeyou26#include<bits/stdc++.h>usingnamespacestd;#defineullunsignedlonglongstrings;intn;constullp=998244353;ullnow_hash;ullv[100005];intcnt;intans;voidget_hash();voiddo_compare();voidinit()......
  • 哈希排序
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,a[1000009];inlinevoidread(registerint&a){a=0;charc;while((c=getchar())<48);doa=(a<<3)+(a<<1)+(c^48);while((c=getchar())>47);}......
  • 哈希表
    目录895最大频率栈优化版本v1优化版本v2看题解了884846一手顺子895最大频率栈复杂度爆了简述一下思路:用栈来存入栈元素,用哈希表来存出现次数,用一个frequency来记录最大出现次数遍历栈,将栈顶元素放到另一个临时栈中,如果栈顶元素的出现次数=frequency,那么说明是最大元素,我就......
  • 哈希学习笔记+杂题(进阶1 字符串哈希)
    哈希杂题前言:竟然下雪了,但是天是灰蒙蒙的。一、哈希学习笔记+杂题(进阶1字符串哈希)相关题单:戳我字符串哈希因为是一种玄学做法,所以具有极强的延展性。所以再碰到字符串的题时,抛开马拉车,kmp,字典树,AC自动机,SA&SAM,先想一下哈希的做法,如果时间复杂度允许,那就可以直接上哈希(虽然你......
  • 哈希学习笔记+杂题(进阶1 字符串哈希)
    哈希杂题前言:竟然下雪了,但是天是灰蒙蒙的。一、哈希学习笔记+杂题(进阶1字符串哈希)相关题单:戳我字符串哈希因为是一种玄学做法,所以具有极强的延展性。所以再碰到字符串的题时,抛开马拉车,kmp,字典树,AC自动机,SA&SAM,先想一下哈希的做法,如果时间复杂度允许,那就可以直接上哈希(虽然你......
  • 哈希学习笔记+杂题(基础2 字符串哈希)
    哈希杂题前言:骗分神器,我之前竟然没有学。一、哈希学习笔记+杂题(基础2字符串哈希)相关题单:戳我1.哈希(hash)简介哈希算法(HashAlgorithm),又称散列算法。有两种用法,第一种就是将一字符串转化成任意进制的数,目的是方便存储。第二种就是将大范围的数映射成小范围的数,目的也是方便存......
  • 线性表(散列)- 哈希表
    哈希表散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表HashSetandHashMap哈希表使用O(N)空间复杂度存储数据,并......
  • CF-1831-E-卡特兰数+异或哈希+差分
    1831-E题目大意给定一个整数\(n\),和\(k\)个区间,区间端点范围在\([1,n]\)内。如果有一个长为\(n\)合法的括号序列,且它的这\(k\)个区间\([l,r]\)中的子括号序列也是合法的,那么称这个括号序列是“好的”。请你求出有多少个长度为\(n\)的“好的”括号序列,答案对\(998244353\)取模......