创建一个公开 Add(a, b) 和类似函数的存储类。内部存储可以是HashSet<T>
其中 T 是合适的字符串元组键。这个 Key 和 comparer 唯一重要的是使用对称的哈希和相等函数,即 (a,b) 等于 (b,a),因此 hash(a,b) == hash(b,a )。
如前所述,许多散列函数都具有此属性,例如散列值的求和和异或。我选择不使用异或,因为这意味着所有相等字符串对的哈希值为零,如果可能出现相等字符串对,这可能会导致查找效率低下。
下面的实现假设所有字符串都不为空,但没有错误检查。
public class Storage
{
private HashSet<Key> set;
public Storage()
{
set = new HashSet<Key>(new Key.Comparer());
}
public void Add(string a, string b)
{
set.Add(new Key{A=a, B=b});
}
public bool Contains(string a, string b)
{
return set.Contains(new Key{A=a, B=b});
}
internal class Key
{
internal String A { get; set; }
internal String B { get; set; }
internal class Comparer : IEqualityComparer<Key>
{
public bool Equals(Key x, Key y)
{
return (x.A == y.A && x.B == y.B) || (x.A == y.B && x.B == y.A);
}
public int GetHashCode(Key k)
{
int aHash = k.A.GetHashCode();
int bHash = k.B.GetHashCode();
// Hash for (x,y) same as hash for (y,x)
if (aHash > bHash)
return bHash * 37 + aHash;
return aHash * 37 + bHash;
}
}
}
}