Hash 哈希代码。如何使用它

Hash 哈希代码。如何使用它,hash,hashtable,hashcode,Hash,Hashtable,Hashcode,虽然我很清楚什么是哈希代码,什么是哈希表,但我必须承认我不知道如何使用它(除了普通字典)。我想实现我自己的哈希表,所以首先我想了解哈希表的基本知识: 我知道我可以用Java和Scala中的getHashCode()/hashCode()获取哈希代码。这个数字是如何确定的。(只是出于好奇) 如果我知道对象的HashCode,如何访问它?也就是说,我怎么能称之为记忆桶 我是否可以更改/设置变量HashCode 现在,我有一个非常大(大约10^9)的Int列表。我将访问其中的一些(从无到全部),我

虽然我很清楚什么是哈希代码,什么是哈希表,但我必须承认我不知道如何使用它(除了普通字典)。我想实现我自己的哈希表,所以首先我想了解哈希表的基本知识:

  • 我知道我可以用Java和Scala中的
    getHashCode()
    /
    hashCode()
    获取哈希代码。这个数字是如何确定的。(只是出于好奇)
  • 如果我知道对象的
    HashCode
    ,如何访问它?也就是说,我怎么能称之为记忆桶
  • 我是否可以更改/设置变量
    HashCode
现在,我有一个非常大(大约10^9)的Int列表。我将访问其中的一些(从无到全部),我需要以尽可能快的方式进行访问。哈希表是最好的方法吗

PS:我不想讨论它,我只想知道哈希表是否是最有效的。如果还有其他的好方法,也许你可以告诉我


谢谢,

哈希代码只是一个数字,保证每种类型的对象都与原始对象“相同”

这意味着为每个哈希代码调用返回“0”是有效的,但会弄巧成拙。关键是可以(而且在大多数情况下会)有重复的

如果您知道对象的哈希代码,则不一定能够访问它。根据我上面的例子,如果所有对象都返回“0”,您仍然无法询问哪个对象的哈希代码为0。但是,您可以请求所有散列代码为0的对象,然后查看它们(这就是哈希表所做的,它通过只获取具有相同散列代码的对象,然后查看这些对象来减少迭代量)

如果要设置(更改)哈希代码,它将不是哈希代码,因为为具有给定“状态”的对象给定的值不能更改

至于“最佳方法”,返回相同哈希代码的唯一对象越少,哈希表的性能就越好。如果你有一个很长的“int”列表,你可以用这个int值作为你的哈希代码,你会得到一个罕见的完美哈希——每个对象映射到一个哈希代码

请注意,哈希表并不真正适合这种存储int的情况。如果您试图存储复杂对象,而这些对象不容易使用其他机制进行唯一识别或比较,那么这种情况会更好

“Int列表”的问题是,如果您有数字5,并且您想在表中查找它,那么您将在那里找到数字5

现在,如果您想查看表中是否存在数字5,那是另一回事

对于一组有几个孔的数字,您可以创建一个简单的布尔数组。如果[5]存在(为真),则a在列表中。如果您的数字集非常稀疏(1,5,100002930304),那么这不是一个很好的解决方案,因为您会在点2,3,4中存储“False”,然后在最后一个数字之前存储一大堆,但这是一个直接查找,无论您添加多少个数字,这一步都不会再花费任何时间——O(1)

通过将这种类型的存储设置为字节数组的二进制查找,可以使其密度更大,但除非您非常擅长位操作,否则请跳过它。它将涉及如下内容:

public boolean doesNumberExist(int number) {
    return bytes[number / 8] & ( 1 << number % 8);
}
public boolean doesNumberExist(整数){

返回字节[number/8]&(1哈希代码只是一个数字,保证每种类型的对象都与原始对象“相同”

这意味着为每个哈希代码调用返回“0”将是有效的,但会弄巧成拙。关键是可以(并且在大多数情况下会)重复

如果您知道某个对象的哈希代码,则不一定能够访问它。根据我上面的示例,如果所有对象都返回“0”,您仍然无法询问哪个对象的哈希代码为0。但是,您可以询问所有哈希代码为0的对象,并查看它们(这就是哈希表所做的,它通过只获取具有相同哈希代码的哈希表来减少迭代量,然后查看这些哈希表)

如果要设置(更改)哈希代码,它将不是哈希代码,因为为具有给定“状态”的对象给定的值不能更改

至于“最佳方法”,返回相同哈希代码的唯一对象越少,哈希表的性能就越好。如果您有一个很长的“int”列表,您只需将该int值用作哈希代码,您将得到一个罕见的完美哈希,即每个对象只映射到一个哈希代码

请注意,hashtable并不适用于这种存储int的情况。它更适合于尝试存储复杂对象的情况,这些对象不太容易使用其他机制进行唯一标识或比较

“Int列表”的问题是,如果您有数字5,并且您想在表中查找它,那么您将在那里找到数字5

现在,如果您想查看表中是否存在数字5,那是另一回事

对于一组有几个洞的数字,可以创建一个简单的布尔数组。如果[5]存在(为true),则列表中的a就不存在。如果你的数字集非常稀疏(1,5,100002930304),那么这不是一个很好的解决方案,因为你会存储“False”在点2,3,4中,然后在最后一个数字之前有一大堆,但这是一个直接查找,无论你添加多少个数字,这一步都不会再花费任何时间——O(1)

通过将这种类型的存储设置为字节数组中的二进制查找,可以使其密度更大,但除非您非常擅长位操作,否则请跳过它。这将涉及如下内容:

public boolean doesNumberExist(int number) {
    return bytes[number / 8] & ( 1 << number % 8);
}
public boolean doesNumberExist(整数){

返回字节[number/8]&(1哈希函数返回一个整数。您可以使用该整数(键)作为索引来存储信息。在java中,您可以使用java.util.Hashtable。