2010-08-10 141 views
1

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

我已经尝试过只是返回字符串的散列,但是它为字符串Provider=Microsoft.ACE.OLEDB.12.0; Data Source=path,Provider=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的有点重要。我应该如何去实施它?

+0

你必须写一个解析器。从正则表达式的框架中根本没有任何帮助。 – 2010-08-10 18:44:34

回答

2

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

然后问题就变成了:将所有等效连接字符串转换为相同字符串有多难?

0

确定连接字符串是否相等,即使不是不可能,也是非常困难的。唯一的假设是,如果字符串相同,则连接字符串是。

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

我的观点:除非您使用定义连接字符串的每个特定组件的类,否则没有业务决定两个连接字符串是否相等,而不是比较字符串。

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; 
}