用于动态GetHash函数的类设计

时间:2011-03-24 18:42:25

标签: oop design-patterns strategy-pattern solid-principles

我需要计算几种类型实例的内部哈希码(某些类型是相互派生的)。这里有两个方面是动态的,可以独立 。只有请求散列的客户端才知道要使用哪种散列算法以及要包含哪些属性。

  1. 使用的实际算法 哈希calunctation可以改变。
  2. 哈希计算应考虑每种类型的成员可以更改。
  3. 您如何根据这些要求设计类型?

2 个答案:

答案 0 :(得分:0)

以下是Eric Lippert的GetHashCode()指南。

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

摘录:
规则:当对象包含在依赖于哈希代码保持稳定的数据结构中时,GetHashCode返回的整数必须永远不会改变

允许(尽管很危险)使一个对象的哈希码值可以随着对象的字段变异而变异。如果你有这样一个对象,并把它放在一个哈希表中,那么改变对象的代码和维护哈希表的代码需要有一些商定的协议,以确保对象在进入时不会发生变异。哈希表。该协议的外观取决于您。

简而言之,如果用于生成哈希码的算法可以更改,那么您需要确保在对象位于您的集合中时它不会更改。

答案 1 :(得分:0)

首先,要求所有“hashable”对象使用一种方法实现相同的接口:getHash()

其次,引入Abstract Factory实例化哈希Strategies

示例(Java 1.6):

public class Foo implements Hashable {
  private String field;
  @Override
  public String getHash() {
    HashFactory.INSTANCE.getMD5Strategy().hash(this.field);
  }
}

正确封装对象内部的决策,以及策略和对象的有效解耦。