【发布时间】:2018-03-22 17:32:46
【问题描述】:
如何获取我的对象的 ID,以便于将其与其他对象区分开来?
class MyClass {
private String s;
private MySecondClass c;
private Collection<someInterface> coll;
// ..many more
public Result calculate() {
/* use all field values recursively to calculate the result */
/* takes considerable amount of time. Implemented */
return result;
}
public String hash() {
/* use all field values recursively to generate a unique identifier */
// ?????
}
calculate() 通常需要大约 40 秒才能完成。因此,我不想多次调用它。
MyClass 对象非常大(~60 MB)。 Result 的计算值只有 ~100 KB。
每当我要对一个对象运行计算时,我的程序应该查找是否已经在早些时候执行过,并且具有完全相同的值,递归。如果是这样,它将在(例如)HashMap 中查找结果。基本上,MyClass 对象本身可以用作键,但 HashMap 将包含 30-200 个元素 - 我显然不想以全尺寸存储所有这些元素。这就是为什么我想存储 30-200 个 Hash/result 值。
所以,我想我会为 MyClass 对象中的所有值生成一个 ID(哈希)。我该怎么做?这样,我可以使用那个哈希来查找结果。 我知道像 MD5 这样的哈希码不能保证 100% 的唯一性,因为多个对象可能具有相同的哈希。但是,如果我通过 MD5 存储(最多)200 个元素,我认为两次使用哈希的机会将是可以忽略的。 16^32=3.4e38 可能有不同的哈希码。我很高兴听到任何人的意见,或者看到其他方法。
生成哈希后,我不再需要该对象,只需要其各自的 result 值。
具有完全相同值的两个单独对象必须返回相同的哈希码。很像原始的 hashCode(),只是我试图保持唯一性。两个对象具有相同哈希码的概率绝对可以忽略不计。
我已经不知道如何用其他语言来描述这个问题了。如果需要进一步澄清,请询问。
那么如何生成我的MyClass.hash()?
问题不在于如何或在何处存储散列,因为我什至不知道如何为整个对象生成一个(几乎)唯一的散列,对于相同的值,它总是相同的。
澄清:
说到大小,我指的是硬盘上的序列化大小。
我不认为将对象放入 HashMap 会减小它们的大小。这就是我想存储一些哈希字符串的原因。 HashMap<hashStringOfMyClassObject, resultValue>
当您将对象放入 HashMap(作为键或值)时,您不会创建它的副本。因此,在 HashMap 中存储 200 个大对象所消耗的内存比 200 个对象本身多一点。
我自己不存储 200 个大型对象。我只保留了 200 个很小的不同结果(作为值),以及 MyClass 对象的 200 个各自的 hashCode,它们也非常小。 “散列”对象的目的是能够使用散列而不是对象值本身。
【问题讨论】:
-
这里似乎有各种各样的问题。为什么您的班级大小为 60MB?你说的大小是什么意思?保留大小?为什么你认为这些对象中的
HashMap会增加呢?这听起来很像 X-Y 问题。 -
你的类是可变的吗?可以使用interning 来减少内存使用吗?
-
当您将对象放入
HashMap中(作为键或值)时,您不会创建它的副本。因此,在HashMap中存储 200 个大对象所消耗的内存比 200 个对象本身要多。 -
编辑了我的问题,请再次阅读结尾