繁体   English   中英

将哈希码作为一个简单的增量可以吗?

Is it okay to have a hashcode as a simple increment?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

下面的代码是否可以将hashCode设为以负数开头的简单增量?

private volatile static AtomicInteger creations = new AtomicInteger(Integer.MIN_VALUE);
private final int creation;

{
    creation = creations.getAndIncrement();
}

@Override
public int hashCode() {
    return creation;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    if (creation == ((Stuff) obj).creation)
        return true;
    else
        return false;
}

为什么通常用质数而不是仅使用简单的增量来生成hashCode? (之所以这样,是因为我用此类创建的每个对象都是唯一的,并且即使对象的状态会发生变化,我也希望以后能够将其从HashMap中删除,因为这是我的了解Hash是否发生了更改,那么您就无法在添加HashMap后将其删除)。为避免这是一个简单的是或否答案,请向我解释以这种方式实现Hash的利弊。

2 个回复

总的来说,这不好。 object1.equals(object2)返回true的两个对象必须具有相同的hashCode

但是,在您的特定情况下,对象平等的唯一标准是creation属性,该属性与hashCode使用的属性相同,您的hashCode很好。

但是,您的hashCodeequals不能提供比Object的默认实现更多的好处,因为a.equals(b)在且仅当a==b为true。

是的,这没关系(如果两个实例相等,则它们具有相同的哈希码),尽管您的equals / hashcode实现与Object的默认实现相比做的不多,所以这样做没有意义-除非您希望对象每2个相等^ 32实例创建。

根据您的补充,我同意Patricia Shanahan提出的使用identityHashCode的建议:

@Override
public int hashCode() {
  return System.identityHashCode(this);
}

@Override
public boolean equals(Object obj) {
 return this == obj;
}

实质上,这就是Object默认情况下所做的。 在冲突方面,我怀疑您将比您的实现与该实现有更多的冲突。

1 Extbase ObjectStorage返回一个哈希码。 但为什么?

我只是扩展了现有的Typo3 4.7扩展,它有两个自己的Model类。 它运行得很好,当我尝试通过Object Accessor {class.subclass.attribute}访问模板中的模型类的某些SubObject时,Backendforms看起来像预期但我无法访问该属性。 给我看 ...

2 快速简单的哈希码组合

人们能否推荐快速简单的方法来组合两个对象的哈希码。 我不太担心冲突,因为我有一个哈希表可以有效地处理冲突,我只想要一些能够尽快生成代码的东西。 阅读 SO 和网络,似乎有几个主要的候选人: 异或 质数乘法异或 简单的数字运算,如乘法/除法(带有溢出检查或环绕) 构建一个字符串,然后使 ...

3 md5 以增量方式散列大文件?

在浏览器中,我使用 JS FileReader().readAsBinaryString() 读入文件。 使用 CryptoJS 库,我可以对数据进行 MD5 散列。 这工作正常,但我不知道如何处理大文件。 例如,仅读取 2GiB 文件就会使浏览器窗口崩溃。 我可以从文件数据中切出 blob 并进 ...

5 使用Google Play上传一个非常简单的应用程序可以吗?

我将我的第一个应用程序上传到了Google Play-仅出于测试目的,我知道该怎么做。 这是一个非常简单的应用程序,它获取字符串并以大写字母返回。 事情是,我收到一条消息,指出该应用程序正在等待处理,需要进行审查。 是否可以将这样一个简单的应用程序上载到Google Play,还是 ...

6 我可以创建一个没有零或字母“O”的哈希码吗?

我正在使用 pyspark 的 sha1() 函数来生成哈希码,有没有办法避免哈希码中的零和字母“O”? 我使用哈希码为我的数据生成唯一的 6 个字符的键。 我需要它是散列,因为当数据发生变化时,我需要一个新的散列码和新的 6 个字符的键。 唯一的问题是当我从散列中提取 6 个字符时,将数据导出到 ...

7 为什么我的哈希码得到一个空指针?

我正在尝试创建自己的哈希码,但出现了空指针错误。 是因为我的对象Suit和Face没有自己的哈希码吗?我一直在网上查找哈希码示例,因为这是我第一次使用它们,因此我尝试从网上看到的示例中进行合并。 } 更新的方法: ...

8 获取一个int和Nullable的哈希码

当前,我将以下类用作我的Dictionary集合的键,该对象集合由ColumnID和可为空的SubGroupID : 我正在考虑以某种方式将其组合为64位整数,但不确定如何处理null的SubGroupIDs 。 据我所知,但这是无效的,因为SubGroupID可以为零: 有任 ...

9 创建一个简单的单向哈希

是否有任何标准的散列函数/方法将任意9位整数映射到另一个(唯一的)9位整数,这样有点难以映射(不使用暴力)。 哈希不应碰撞,所以每一个输出1 ≤ y < 10^9需要从一个映射和只有一个输入值1 ≤ x < 10^9 。 ...

10 函数在C ++中返回简单的哈希码

我正在尝试从我的C ++书中进行以下编程练习:“ 编写一个将字符串作为参数并返回primitve哈希码的函数,该哈希码是通过将字符串中所有字符的值相加得出的。 ” 我对此的解决方案是: 问题是:函数似乎总是跳过for循环,因此总是返回hash_value = 0 。 当我在函数中 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM