Java 当我们散列一个特定的字符串或单词时,实际发生了什么(实际过程)
嗨,我正在尝试用java开发一个计数布鲁姆过滤器。我真的搜索了有关布卢姆过滤器的大部分来源。。我理解的是,当我们对特定的字符串或单词进行散列(散列)时,散列的结果将返回一个值,以便我们可以将内容存储在结果值的位置。Java 当我们散列一个特定的字符串或单词时,实际发生了什么(实际过程),java,hashtable,hash,bloom-filter,Java,Hashtable,Hash,Bloom Filter,嗨,我正在尝试用java开发一个计数布鲁姆过滤器。我真的搜索了有关布卢姆过滤器的大部分来源。。我理解的是,当我们对特定的字符串或单词进行散列(散列)时,散列的结果将返回一个值,以便我们可以将内容存储在结果值的位置。 但我的大问题是如何进行散列(算法)。当我们散列一个特定的字符串或单词时会发生什么。你能解释一下,当我们散列一个特定的字符串或单词时,会发生什么情况(比如当我们对特定的字符串或单词进行散列时,特定的最终值是如何到达的)。我还读到也有发生碰撞的机会。您还可以解决为什么结果散列值不是唯一的
但我的大问题是如何进行散列(算法)。当我们散列一个特定的字符串或单词时会发生什么。你能解释一下,当我们散列一个特定的字符串或单词时,会发生什么情况(比如当我们对特定的字符串或单词进行散列时,特定的最终值是如何到达的)。我还读到也有发生碰撞的机会。您还可以解决为什么结果散列值不是唯一的(为什么它有时会为不同的输入返回相同的散列值)。我是否真的需要编写代码来进行哈希运算,或者java中是否有任何内置函数来进行哈希运算。您只需在任何对象上调用
hashCode()
即可获得哈希代码。特别是对于classString
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文件管理器中,您需要多个哈希。