2011-12-19 212 views
0

我需要一種將字符串集合轉換爲唯一字符串的方法。這意味着如果集合中的任何字符串發生更改,我需要使用不同的字符串。如何從字符串集合中生成一個唯一的字符串?

我正在研究一個大的解決方案,所以我可能無法使用一些更好的想法。所需的唯一字符串將用於比較2個集合,因此不同的字符串表示不同的集合。我無法逐個比較內部的字符串,因爲順序可能會發生變化,並且解決方案已經構建成基於2個字符串比較返回結果。這是一個附加組件。生成的字符串將作爲參數傳遞給此比較。

謝謝!

+4

{「一」,」 b「,」c「}!= {」a「,」c「,」b「}或順序無關緊要?首先,你必須在這裏定義不同的集合 – 2011-12-19 15:49:23

+0

使用散列算法? MD5,SHA-1 ... – 2011-12-19 15:50:01

+1

如果您的目標是比較集合,請考慮實施IEquatable Erix 2011-12-19 15:50:26

回答

1

這兩者都通過決定使用「:」的分隔符來工作,並且還使用轉義字符來表示何時由分隔符表示其他意思。因此,我們只需要在將它們與我們之間的分隔符連接之前將所有的字符串轉義。這給了我們每個集合獨特的字符串。如果我們想讓集合相同,無論順序是在我們做任何事情之前對我們的集合進行排序,我們所需要做的就是。我要補充一點,我的示例使用LINQ,因此假設集合實現IEnumerable<string>和你有一個使用聲明System.LINQ

你可以用,最多的功能如下

string GetUniqueString(IEnumerable<string> Collection, bool OrderMatters = true, string Escape = "/", string Separator = ":") 
{ 
    if(Escape == Separator) 
     throw new Exception("Escape character should never equal separator character because it fails in the case of empty strings"); 
    if(!OrderMatters) 
     Collection = Collection.OrderBy(v=>v);//Sorting fixes ordering issues. 
    return Collection 
     .Select(v=>v.Replace(Escape, Escape + Escape).Replace(Separator,Escape + Separator))//Escape String 
     .Aggregate((a,b)=>a+Separator+b); 
} 
1

怎麼樣使用hash function

+0

散列函數不返回唯一字符串 – 2011-12-19 16:00:15

+1

@MoslemBenDhaou加密散列函數幾乎肯定會返回唯一字符串。如果你發現兩個字符串散列到同一個東西,這將是一個大新聞。 – BenH 2011-12-19 16:01:38

+0

「Ea」和「FB」,它只是取決於用來散列字符串的素數。與32位sdk,它往往是素數31.它只是「a」和「b」之間的差異。 – 2011-12-19 16:07:31

0

「收集字符串」的意思是「字符串集合」?

這是一個天真(但工作)的方法:對集合進行排序(以消除對訂單的依賴),對它們進行連接,並對其進行連接(例如MD5)。

微不足道的執行,但不是非常聰明的性能明智。

+0

是的,但哈希函數不會返回唯一字符串 – 2011-12-19 15:59:47

+0

MD5(例如)是一個128位數字。這是很多不同的價值觀。其他哈希更長。我不會認真對待碰撞。 – 2011-12-19 16:06:59

+0

該解決方案的實際問題(與提供的許多解決方案一樣)是將{「AB」,「C」}與{「A」,「BC」}進行比較的極端情況。哈希部分真的很好(但不必要) – ForbesLindesay 2011-12-19 16:35:54

0

你是說你需要將字符串集合編碼爲一個字符串。因此,例如集合{「abc」,「def」}可能被編碼爲「sDFSDFSDFSD」,但{「a」,「b」}可能被編碼爲「SDFeg」。如果是這樣,你不關心唯一的密鑰,那麼你可以使用SHA或MD5的東西。

+0

是的,這是我說的,但我需要從編碼2集合生成的字符串始終是唯一的。這就是爲什麼我不能使用散列函數。 – 2011-12-19 15:57:42

+0

@Moslem大多數哈希函數可以被認爲是唯一的,除非樣本量很大,我的意思是絕對巨大,但如果你不關心結果的大小,那麼你可以連接它們。 – ForbesLindesay 2011-12-19 16:04:04

1

考慮到你的限制,使用分隔的方法:

選擇一個分隔符和逃生方法。 例如使用 ;和逃避它bwithin串Y \ ;,也\\

所以該字符串列表逃脫\ ...

"A;bc" 
"D\ef;" 

...成爲"A\;bc;D\\ef\;"

這是不漂亮,但考慮它必須是一個字符串,那麼csv和它的弟兄們的古老方式並不是太糟糕。

相關問題