或者他是对的,使用默认的object.hashCode()实现,我们永远不会发生冲突,即两个不同的对象永远不会有相同的hashCode。如果是的话,为什么那么多的java手册没有明确地这么说。
我如何编写一些代码来演示这一点呢?因为通过演示,我还可以证明hashmap中的bucket可以包含不同的hashcode(我试图向他展示hashmap在哪里展开的调试器,但他告诉我这只是逻辑实现,而不是内部ALGO?)
2^30唯一值听起来好像很多,但是生日问题意味着我们不需要很多对象来得到碰撞。
下面的程序对我来说在大约一秒钟内起作用,给出了物体196和121949之间的碰撞。我怀疑这将很大程度上取决于您的系统配置,编译器版本等。
正如您可以从hashable
类的实现中看到的,每个类都是唯一的,但仍然存在冲突。
class HashCollider
{
static class Hashable
{
private static int curr_id = 0;
public final int id;
Hashable()
{
id = curr_id++;
}
}
public static void main(String[] args)
{
final int NUM_OBJS = 200000; // birthday problem suggests
// this will be plenty
Hashable objs[] = new Hashable[NUM_OBJS];
for (int i = 0; i < NUM_OBJS; ++i) objs[i] = new Hashable();
for (int i = 0; i < NUM_OBJS; ++i)
{
for (int j = i + 1; j < NUM_OBJS; ++j)
{
if (objs[i].hashCode() == objs[j].hashCode())
{
System.out.println("Objects with IDs " + objs[i].id
+ " and " + objs[j].id + " collided.");
System.exit(0);
}
}
}
System.out.println("No collision");
}
}
我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。
问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一
据我所知,两个不相等的对象可以具有相同的哈希代码。当添加或从HashMap java中检索时,将如何处理这个问题?
问题内容: 我明白为什么为两个相等的(通过)对象提供相同的哈希码很重要。但是反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同还存在吗?我找不到一个可能发生这种情况的示例,因为如果所有使用equals方法的属性都被用来覆盖hashcode方法,那么我们将始终对相等的对象使用相同的hashcode。请评论。 问题答案: 如果两个对象相同,则它们不一定相等。否则,您将发现完美的哈希函数。 但
问题内容: 根据我的理解,我认为: 两个对象具有相同的哈希码是完全合法的。 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。 如果两个对象不相等,则它们不能具有相同的哈希码 我对么? 现在,如果正确的话,我有以下问题:HashMap内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何HashMap跟踪它使用的键? 有人可以解释HashMap内部如何使用对象的
问题内容: 我有一个函数可以在C#中生成MD5哈希,如下所示: 在Java中,我的函数如下所示: C#代码生成:“ 02945C9171FBFEF0296D22B0607D522D”时,Java代码生成:“ 5a700e63fa29a8eae77ebe0443d59239”。 有没有办法为相同的字节数组生成相同的md5哈希? 一经请求: 这是java中的测试代码: 这是我在C#中的代码 干杯 问题