【问题标题】:Java how to make the hash uniqueJava如何使哈希唯一
【发布时间】:2017-09-14 09:34:27
【问题描述】:

我正在尝试创建一个抽象类 Coin,具有实例变量名称(字符串)、符号(java.awt.Image 类型)和哈希(字符串)。问题是我需要创建属性散列与默认 hashcode() 方法返回的散列不同,因此具有唯一的 Coin 散列。

abstract class Coin {

    private String name;
    private Image symbol; 
    private String hash;

}

【问题讨论】:

  • 哈希码不是String。您总是可以尝试return name.hashCode()+symbol.hashCode() 形式的东西,但哈希码的本质是它们不是唯一的。这里没有generics
  • 哈希计算应该按照与equals() 相同的理念设计(编码)——这是相等的比较。哈希可以重复 - equals() 告诉真
  • stackoverflow.com/questions/113511/… - 看看这个。解释创建自己的哈希的好方法
  • @EJP 是的,你说得对,哈希码不是字符串,但是在这个特定的任务中,我需要将哈希设为字符串并让 Coin 的哈希唯一。好吧,我可能错误地解释了任务的实现,但我很想看看你实现它的方式。 (对于草率的代码,我很抱歉,但我是初学者)
  • 赋值“唯一哈希”不正确。不知道,这是学校(理解不好),还是行业(XY问题)

标签: java generics hash interface hash-code-uniqueness


【解决方案1】:

在我继续之前让您知道,由于hash collision,哈希值可能永远不会 100% 唯一。

话虽如此,我假设您想要一个用于变量哈希的唯一字符串(注意 java 中的 hashCode() 函数不同,因为它返回一个 int)

散列算法有很多种,在这种情况下我通常用于统一的一种是MD5

有一个名为 DiguestUtilityApache 实用程序,它让生活变得轻松。

这是一个使用示例:

DigestUtils.md5(byte[] bytes);// --> returns a string of 32 char long
DigestUtils.md5(String s);// --> returns a string of 32 char long
...

通读文档中的方法,看看哪一种更适合你。

【讨论】:

    【解决方案2】:

    您可以通过以下方式覆盖默认的hashCode() 函数:

     @Override
    public int hashCode() {
        // Unique hashcode generating function goes here
        return hash;
    }
    

    一种方法可能是使用name.hashCode()+symbol.hashCode()

    【讨论】:

    • 数学说,这种哈希的统计参数很差——但技术上还可以
    • 一般来说,hashCode() 方法的唯一性很差,碰撞非常频繁。
    • @nafas 垃圾。它完全取决于方法的编写方式。您不能就单纯的方法签名做出这样的笼统陈述。
    • @EJP hashCode() 返回一个 int,因此组合的数量绑定到 32 位。甚至 MD5(现在应该是不安全的)也有 128 位,
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2014-09-03
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多