2010-08-10 64 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; 
}