问题
我需要一种为对象字典生成键的方法。但是,我有一些要求使这有点困难。这是场景:
- Dictionary 是引用类型对象的列表。
- Dictionary 是
private
,在一个静态类中。 - 外部代码需要获取字典中特定对象的键,但不得访问字典中的对象或字典本身。
- 给定字典中的特定对象,键必须始终是可重新计算/可导出的。如果对象上的属性发生更改,则密钥不得更改。
- 相反,如果创建的新对象可以评估为
equal
字典中的另一个对象,则键必须不同,因为它们是两个独立的对象。 - 此实现必须是线程安全的。
非解决方案
解决方案 #1
所有 .Net 对象都包含一个名为 的方法.GetHashCode()
,该方法返回一个整数值。您可以将其用作键。
问题
不可能。MSDN 状态:
相等的两个对象返回相等的哈希码。
这打破了req #5,我假设(但未经测试)req。#4。如果它可以满足这些规则,我很想有这样的选择。
解决方案 #2
将指向对象的指针转换为 anint
并将其用作键。
问题
这打破了req的本质。#3。传递指针并将它们用作键并不安全。
解决方案#3
将指向对象的指针转换为整数散列值并使用散列作为键。
问题
尽管这不会违反任何规则,但我更愿意避免访问指针,因为这将涉及使用unsafe
代码。如果必须,我不反对使用不安全的代码,但如果可能的话,我宁愿避免使用它。
结论
可能我的要求有点挑剔。必须有某种合理的方法从唯一对象派生密钥。有没有人经历过这样的场景并解决了这个困境?