像许多人一样,我使用ReSharper来加速开发过程.当您使用它来覆盖类的相等成员时,它为GetHashCode()生成的代码生成如下所示:
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397) ^ ObjectId;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我有一些自己的成员,但我想知道的是为什么397?
我想知道GetHashCode()在string实例上调用方法时获取重复值的可能性.例如,根据这篇博文, blair并brainlessness在x86机器上具有相同的哈希码(1758039503).
我正在散列大量文件,并且为了避免哈希冲突,我还存储了文件的原始大小 - 这样,即使存在哈希冲突,文件大小也几乎不可能相同.这是声音(哈希冲突同样可能是任何大小),或者我是否需要另一条信息(如果碰撞更可能与原始信息的长度相同).
或者,更一般地说:无论原始文件大小如何,每个文件是否都可能产生特定的哈希值?
我重写了两个int的简单容器对象的equals和hashcode方法.每个int都反映了另一个对象的索引(该对象是什么并不重要).该类的要点是表示两个对象之间的连接.
连接的方向无关紧要,因此无论两个整数在对象中的哪个方向,equals方法都应该返回true.
connectionA = new Connection(1,2);
connectionB = new Connection(1,3);
connectionC = new Connection(2,1);
connectionA.equals(connectionB); // returns false
connectionA.equals(connectionC); // returns true
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的(从Integer的源代码修改):
public class Connection {
// Simple container for two numbers which are connected.
// Two Connection objects are equal regardless of the order of from and to.
int from;
int to;
public Connection(int from, int to) {
this.from = from;
this.to = to;
}
// Modifed from Integer source code
@Override
public boolean equals(Object obj) {
if …Run Code Online (Sandbox Code Playgroud) 我有一个系统,需要一个唯一的6位数代码来表示一个对象,我正在考虑一个很好的算法来生成它们.以下是预先要求:
我有一个想法听起来像它会工作,但我在数学上不够好,无法弄清楚如何实现它:如果我从0开始并增加N,然后转换为基数20,似乎应该是N的一些值,让我可以在重复任何值之前计算0-63,999,999中的每个值.
例如,使用N = 3(因此10 mod 3)从0到9:0,3,6,9,2,5,8,1,4,7.
是否有一些神奇的数学方法可以计算出一些较大数字的N值,这些数值能够计算整个范围而不重复?理想情况下,我选择的数字会在集合周围跳跃,这样就不会有明显的模式,但我不确定它是多么可能.
或者,一个保证0-64百万的唯一性的散列算法可以工作,但我太愚蠢了,不知道这是否可行.
language-agnostic puzzle algorithm math hash-code-uniqueness
如果我使用比数据(例如sha-256)更大的字节大小的散列算法散列大小受限的类似数据(例如社会安全号),那么散列将保证与单词相同的唯一性级别.原始数据?
我有一个坐标为键的HashMap.
坐标有3个长度,保持x,y和z坐标.(坐标是并且需要是一个自定义类,坐标需要很长).
现在我希望能够通过以下方式访问例如字段[5,10,4] : hashMap.get(new Coordinate(5, 10, 4)).
我已经实现了equals方法,但这还不够,因为显然我还需要为hashCode提供一个实现.所以我的问题是我如何从三个长度生成一个独特的hashCode?.
附加:使用外部库中的哈希生成器不是选项.
所以我正在阅读有关哈希表,哈希函数等的内容.我很感兴趣在维基百科上阅读"动态完美哈希"如何使用第二个哈希表作为数据结构来存储特定存储桶中的多个值.
然而,当我遇到如何选择通用散列函数来执行第二个散列表的散列时.任何人都可以解释这个通用哈希函数是如何根据存储在存储桶中的值确定的?我模糊地遵循维基百科的"通用哈希函数"页面中的推理和逻辑,但我很难对它有任何直觉.特别是,这些功能如何保证不发生冲突?或者至少,如果它们被处理掉并且如果检测到碰撞就会产生新的一个,我们怎么知道这可以在实际的时间内完成呢?
瓢虫书的解释好吗?
我有以下代码来生成对象的哈希:
public int GetHashCode(MyType obj)
{
return (obj.Prop1.GetHashCode() + obj.Prop2.GetHashCode() + obj.Prop3.GetHashCode()).GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
即我添加所有属性的哈希码,然后获取此哈希值.
在审查中,一位同事建议这将过于频繁地发生碰撞.我不确定这是真的,因为:
谁是对的?
它是在C#中,以防答案是特定于语言的.
我有一个简单的自定义Point类,如下所示,我想知道我的hashCode实现是否可以改进,或者这是否是最好的.
public class Point
{
private final int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
@Override
public boolean equals(Object other)
{
if (this == other)
return true;
if (!(other instanceof Point))
return false;
Point otherPoint = (Point) other;
return otherPoint.x == x && otherPoint.y == y;
}
@Override
public int hashCode()
{
return (Integer.toString(x) + "," + Integer.toString(y)).hashCode(); …Run Code Online (Sandbox Code Playgroud)