2011-12-19 211 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和它的弟兄们的古老方式并不是太糟糕。

相关问题