【问题标题】:Is it possible to use hashCode as a content unique ID?是否可以使用 hashCode 作为内容唯一 ID?
【发布时间】:2020-07-06 10:49:43
【问题描述】:

我需要比较两个大字符串。与其使用这样的equals方法,有没有像hashCode之类的方法或为String生成唯一ID的方法? 那是因为我的字符串非常大。另外,我需要不同的内容唯一 ID。是否可以出于我的目的在 String 中使用hashCode

【问题讨论】:

  • 这能回答你的问题吗? Why do I need to override the equals and hashCode methods in Java?。简短回答:String 已经实现了快速hashCode(),用于加快比较速度。 :) 但是hashCode() 不是唯一的,所以你不能避免有时调用equals()
  • 您最好只使用UUID 类来生成唯一标识符。
  • UUID 不能用于比较字符串。没有哈希码也不起作用,尽管在许多情况下它们会加快比较速度,但您必须比较整个字符串以确定字符串是否相等(不相等的字符串虽然会很快比较为假)。
  • 另外,我想得越多,它似乎越是过早的优化。字符串比较通常检查的第一件事是长度,这是一个非常快速的操作。 “让它更快”的复杂系统可能是不需要的,甚至会使代码变慢。首先分析代码,然后仅在整个系统运行时才需要添加复杂性。

标签: java hashcode hash-code-uniqueness


【解决方案1】:

hashCode 的目的是提供一种快速 方法来识别大多数两个对象比较不相等的情况。在大多数情况下,误报率为 1% 的哈希函数被认为优于误报率为 0% 的哈希函数,但所需时间是后者的两倍。

有一些散列函数被设计用作“摘要”,因此两个任意长度的不同字符串非常不太可能具有相同的摘要。然而,为了非常有效,摘要需要比 32 位哈希码值大得多。精心设计的 64 字节(512 位)摘要通常足以保护任何长度的字符串,以至于一个人在同一个周末被闪电击中两次的可能性更大,因为一个人赢得了五个州彩票而不是找到两个产生相同摘要的不同字符串。为一个字符串计算一个好的摘要函数的成本将远大于将该字符串与另一个字符串进行比较的成本,但是如果将每个字符串与许多其他字符串进行比较,则计算每个摘要函数一次并将其与每个字符串的摘要进行比较其他字符串可能会带来主要的性能优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2020-10-07
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2015-09-07
    相关资源
    最近更新 更多