基于连接字符串实现GetHashCode

时间:2010-08-10 18:31:22

标签: c# hash

对于只有属性为连接字符串的类的rules for the GetHashCode method in MSDN,我遇到了困难。

我试过返回字符串的哈希值,但是为字符串Provider=Microsoft.ACE.OLEDB.12.0; Data Source=pathProvider=Microsoft.ACE.OLEDB.12.0; Data Source=path;Data Source=path;Provider=Microsoft.ACE.OLEDB.12.0;返回了不同的值,所有这些都是等价的。

然后,我尝试使用OleDbConnectionStringBuilder.GetHashCode方法,但在这种情况下甚至不返回相同的HashCode:

test1.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" +
        PathToExcelFile + ";Extended Properties='Excel 12.0 Macro;HDR=YES;IMEX=1';";
test2.ConnectionString = test1.ConnectionString;

Console.WriteLine(test1.GetHashCode());
Console.WriteLine(test2.GetHashCode());

我的目标是将我的类用作词典的键,因此GetHashCode非常重要。我该如何实施呢?

3 个答案:

答案 0 :(得分:2)

定义规范连接字符串并在该字符串上调用GetHashCode。在这种情况下,您可以将“Provider = Microsoft.ACE.OLEDB.12.0; Data Source = path”定义为规范形式,然后您需要将所有等效连接字符串转换为规范字符串,然后调用GetHashCode。

接下来的问题是:将所有等效连接字符串转换为相同的字符串有多难?

答案 1 :(得分:0)

确定连接线是否相等是非常困难的,如果不是不可能的话。您可以做的唯一假设是,如果字符串相等,则连接字符串为。

例如 - “。”可能等于“localhost”。或者localhost可能有一个主机文件条目重新定义它。框架的某些未来版本可能需要“;”在字符串的末尾..两个驱动程序版本可能在功能上等同,但你对它们的区别对待..在哪里画线是一个非常片状的问题。

我的观点:除非您使用定义连接字符串的每个特定组件的类,否则您无法决定两个连接字符串是否相等,除了比较字符串之外。

答案 2 :(得分:0)

我已根据两个答案的输入解决了这个问题:

  

定义规范连接字符串

  

除非您使用定义每个特定组件的类   连接字符串,你没有   业务决定是否两个   连接字符串相等,超出   比较字符串。

所以,我为OleDbConnectionStringBuilder创建了一个扩展方法:

public static int GetRealHashCode(this OleDbConnectionStringBuilder target)
{
    int ToReturn = 17;
    ToReturn *= target.DataSource.TrimEnd(';').GetHashCode();
    ToReturn *= target.Provider.TrimEnd(';').GetHashCode();
    ToReturn *= target.PersistSecurityInfo.ToString().GetHashCode();

    var OrderedKeys = from string key in target.Keys
              orderby key
              select key;
    foreach (string Key in OrderedKeys)
        ToReturn *= target[Key].GetHashCode();

    return ToReturn;
}