Java 当我们散列一个特定的字符串或单词时,实际发生了什么(实际过程)

Java 当我们散列一个特定的字符串或单词时,实际发生了什么(实际过程),java,hashtable,hash,bloom-filter,Java,Hashtable,Hash,Bloom Filter,嗨,我正在尝试用java开发一个计数布鲁姆过滤器。我真的搜索了有关布卢姆过滤器的大部分来源。。我理解的是,当我们对特定的字符串或单词进行散列(散列)时,散列的结果将返回一个值,以便我们可以将内容存储在结果值的位置。 但我的大问题是如何进行散列(算法)。当我们散列一个特定的字符串或单词时会发生什么。你能解释一下,当我们散列一个特定的字符串或单词时,会发生什么情况(比如当我们对特定的字符串或单词进行散列时,特定的最终值是如何到达的)。我还读到也有发生碰撞的机会。您还可以解决为什么结果散列值不是唯一的

嗨,我正在尝试用java开发一个计数布鲁姆过滤器。我真的搜索了有关布卢姆过滤器的大部分来源。。我理解的是,当我们对特定的字符串或单词进行散列(散列)时,散列的结果将返回一个值,以便我们可以将内容存储在结果值的位置。
但我的大问题是如何进行散列(算法)。当我们散列一个特定的字符串或单词时会发生什么。你能解释一下,当我们散列一个特定的字符串或单词时,会发生什么情况(比如当我们对特定的字符串或单词进行散列时,特定的最终值是如何到达的)。我还读到也有发生碰撞的机会。您还可以解决为什么结果散列值不是唯一的(为什么它有时会为不同的输入返回相同的散列值)。我是否真的需要编写代码来进行哈希运算,或者java中是否有任何内置函数来进行哈希运算。

您只需在任何对象上调用
hashCode()
即可获得哈希代码。特别是对于class
String
from:

公共int hashCode()

返回此字符串的哈希代码。字符串对象的哈希代码 计算为

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

使用int算术,其中s[i]是字符串n的第i个字符 是字符串的长度,^表示求幂。(散列 空字符串的值为零。)


字符串执行的代码如下:

public int hashCode() {
int h = hash;
    int len = count;
if (h == 0 && len > 0) {
    int off = offset;
    char val[] = value;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}
public int hashCode(){
int h=散列;
int len=计数;
如果(h==0&&len>0){
int off=偏移量;
char val[]=值;
对于(int i=0;i
散列是一个函数(不是双射),因此,不同的输入可以产生相同的结果。这是散列函数的基础

“散列”是一个函数

H:I->O

通常,集合
I
O
大得多或更复杂。在哈希表中,
I
是元素的类,而
O
是正整数的集合。特别是,在bloom过滤器中,您具有不同的功能。要开发哈希函数,需要提取相似对象的不同特征。例如,对于字符串,可以有:

  • 长度
  • 第一个字符
  • 特定字符出现的次数
  • 作为多项式计算的字符串
    h(S)=和(S(i)*31^i)mod d

当使用多个散列时,应避免特征冲突,例如,使用
voyels的数量
非voyels的数量
并没有真正的帮助。散列函数必须具有一些特性,请看Java允许您重写类的hashCode()方法以使用散列算法

public class Employee {


   // Default implementation might want to use "name" for as part of hashCode
   private String name; 

   @Override
   public int hashCode() {
     // We know that ID is always unique, so don't use name in calculating 
     // the hash code. & hashCode() is an int
     return id;
   }
}
*(如果要覆盖hashCode,还应覆盖equals。)

哈希代码是根据存储在集合中的每个对象计算的。 它是使用标准算法计算的。 您确实可以基于每个对象重写hashcode方法。 实现hashcode方法的一种方法是使用HashcodeBuilder


希望这有帮助。在与本文相关的stack overflow中搜索更多内容,您可以获得更多描述性的答案。

在提问之前,请稍微研究一下主题:在bloom文件管理器中,您需要多个哈希。