我们要求在文件中读/写超过1000万个字符串.此外,我们不希望文件中有重复项.由于字符串在读取后会立即刷新到文件中,因此我们不会将其保留在内存中.
我们不能使用哈希码,因为哈希码中的冲突导致我们可能会错过字符串作为重复.我在谷歌搜索中找到的另外两种方法:
1.使用消息摘要算法,如MD5 - 但计算和存储可能成本太高.
2.使用校验和算法.[我不确定这是否会产生一个字符串的唯一键 - 有人可以确认]
是否有任何其他方法可用.谢谢.
编辑:准备我的对象以便在HashMap中使用.
在阅读了一下如何生成哈希码之后,我现在很困惑.我的(可能是微不足道的)问题是,当我有一个可以使用的字段时,我应该如何实现hashCode方法?我可以直接使用fiels吗?如果我理解正确的话,hashCode的值在对象的生命周期内不能改变,我只有一个适合这个的ID,但是我已经在其他地方读过,那个人不应该使用ID ...这个怎么样,怎么样一个基于这个(唯一且没有变化)值的hashCode函数会是什么样的?equals方法也仅基于id ..
Javadocs说:
返回此Method的哈希码.哈希码被计算为底层方法声明类名和方法名的哈希码的异或.
这个描述中明显缺少的是Method的参数类型的类型 - 这是否意味着同一个类上具有相同名称但参数不同的两个方法会有相同的hashCode()?
通过trie map我的意思是一个关联数组,其中有效负载存储在trie而不是散列表中.
当我使用哈希映射/表时,我使用的键通常是字符串.哈希映射优于某些基于trie的映射有什么优势?我已经读过哈希映射更快 - 但在我看来,一致的哈希函数必须检查(char)数组的每个元素以获得最终的哈希 - 迭代数组一次.在一个特里,你同样必须迭代数组一次.
在我看来,在编码小对象时会使用更多的内存(即使你只允许键中的小写字母字符,每个节点有26个指针,每个键通常有多个节点),但从正面看你永远不必担心调整大小.为什么哈希地图如此常见,但我从未见过特里地图?
如果只有一个对象的某些字段代表实际状态,我认为在覆盖equals和hashCode... 时可以忽略这些字段.
我对此感到不安,并想问,
equals/中的某些字段时是否有任何文档或指南hashCode?在我的特殊情况下,我正在探索一个问题的状态空间.我想保留一组访问状态,但我也在考虑包括通往该州的路径.显然,两个国家是平等的,即使它们是通过不同的途径找到的.
我有hashCode()使用hibernate委托给未初始化对象的问题.
我的数据模型看起来如下(以下代码经过高度修剪以强调问题因此破坏,不要复制!):
class Compound {
@FetchType.EAGER
Set<Part> parts = new HashSet<Part>();
String someUniqueName;
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getSomeUniqueName() == null) ? 0 : getSomeUniqueName().hashCode());
return result;
}
}
class Part {
Compound compound;
String someUniqueName;
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getCompound() == null) ? 0 : getCompound().hashCode());
result = …Run Code Online (Sandbox Code Playgroud) 我想知道Hashtable#hashCode()当Hashtable只包含每对具有相同键和值的条目时,Java的默认实现是否被破坏.
请参阅以下应用程序:
public class HashtableHash {
public static void main(final String[] args) {
final Hashtable<String, String> ht = new Hashtable<String, String>();
final int h1 = ht.hashCode();
System.out.println(h1); // output is 0
ht.put("Test", "Test");
final int h2 = ht.hashCode();
System.out.println(h2); // output is 0 ?!?
// Hashtable#hashCode() uses this algorithm to calculate hash code
// of every element:
//
// h += e.key.hashCode() ^ e.value.hashCode()
//
// The result of XOR on identical hash codes is always …Run Code Online (Sandbox Code Playgroud) 我需要一个具有快速索引和哈希访问权限的集合类.现在我有了ArrayList.它具有良好的索引访问,但他的contains方法不具备性能.HashSet具有良好的contains实现,但没有索引访问.哪个系列都有?可能来自Apache的东西?或者我应该创建自己的集合类,它具有:用于索引访问的ArrayList和用于contains检查的HashSet ?
只是为了澄清:我需要get(int index)和contains(Object o)
我发现这个注释可以将StringBuffer对象作为Java中TreeSet中的键吗?
"在Java中使用地图有两种识别策略(或多或少).
散列:输入"Foo"被转换为尽可能最好的尝试,以生成唯一访问数组索引的数字.(纯粹主义者,请不要虐待我,我故意简化).此索引是存储值的位置."Foo"和"Bar"实际上可能生成相同的索引值,这意味着它们都将映射到相同的数组位置.显然这不起作用,所以这就是"equals()"方法的用武之地; 它用于消除歧义
比较:通过使用比较方法,您不需要这个额外的消歧步骤,因为比较首先不会产生这种碰撞."Foo"等于的唯一关键是"Foo".一个非常好的想法是,如果你可以将"equals()"定义为compareTo()== 0; 为了一致的缘故.不是要求."
我的问题如下:如果我的类实现了可比性,那么它是否意味着我不必重写equals和hashcode方法来将我的对象用作Hash集合中的键.例如
class Person implements Comparable<Person> {
int id;
String name;
public Person(int id, String name) {
this.id=id;
this.name=name;
}
public int compareTo(Person other) {
return this.id-other.id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以在Hashable集合中使用我的Person对象吗?
假设我有一个带有颜色和模型字段的汽车.我需要将汽车存放在一个集合中,我将不会重复(没有2辆相同的汽车).在下面的示例中,我使用的是HashMap.
根据Java文档,如果我们有2个Car对象car1和car2这样car1.equals(car2) == true,那么它也必须持有它car1.hashCode() == car2.hashCode().因此,在这个例子中,如果我想只是它们的颜色比较汽车,那么我会只用色域的equals()和hashCode(),正如我在我的代码做了,而且它完美的罚款.
public class Car {
String color;
String model;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((color == null) ? 0 : color.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Car other = (Car) …Run Code Online (Sandbox Code Playgroud) hashcode ×10
java ×9
equals ×3
hashtable ×2
checksum ×1
collections ×1
comparable ×1
contains ×1
hashmap ×1
hibernate ×1
key ×1
reflection ×1
trie ×1