基于一对字符串生成唯一字符串

时间:2011-02-24 08:59:55

标签: c# string unique

我有两个字符串StringA,StringB。我想生成一个唯一的字符串来表示这对。

f(x,y)对于每个x,y和f(x,y)= f(y,x)应该是唯一的,其中x,y是字符串。

有什么想法吗?

9 个答案:

答案 0 :(得分:4)

计算两个字符串的消息摘要并对值进行异或

MD5(x) ^ MD5(Y)

消息摘要为每个字符串提供唯一值,而XOR使得f(x,y)可以等于f(y,x)。

编辑:正如@Phil H观察到的那样,你必须处理你接收两个相等字符串作为输入的情况,这将在XOR之后产生0。如果x和y相同,则可以返回类似MD5(x+y)的内容,其余值则返回MD5(x) ^ MD5(y)

答案 1 :(得分:3)

只需创建一个新类并覆盖Equals& GetHashCode

class StringTuple
{
    public string StringA { get; set; }
    public string StringB { get; set; }

    public override bool Equals(object obj)
    {
        var stringTuple = obj as StringTuple;
        if (stringTuple == null)
            return false;

        return (StringA.Equals(stringTuple.StringA) && StringB.Equals(stringTuple.StringB)) ||
            (StringA.Equals(stringTuple.StringB) && StringB.Equals(stringTuple.StringA));
    }

    public override int GetHashCode()
    {
        // Order of operands is irrelevant when using *
        return StringA.GetHashCode() * StringB.GetHashCode();
    }
}

答案 2 :(得分:2)

找到一种独特的方式来订购它们并与分隔符连接。

def uniqueStr(strA,strB,sep):
    if strA <= strB:
        return strA+sep+strB
    else:
        return strB+sep+strA

对于任意长的字符串列表,可以对列表进行排序或生成集合,然后使用分隔符连接:

def uniqueStr(sep,strList):
    return sep.join(Set(strList));

最好是,如果字符串很长或分隔符选择有问题,请使用散列并散列结果:

def uniqueStr(sep,strList):
    return hash(''.join([hash(str) for str in Set(strList)]))

答案 3 :(得分:1)

我认为以下内容应该产生唯一的字符串:

String f = Replace(StringA<StringB?StringA:StringB,"@","@@") + "}@{" + Replace(StringA<StringB?StringB:StringA,"@","@@")

(也就是说,字符串中只有一个地方可以出现一个“@”符号,我们不必担心StringA结尾处的“@”运行与运行混淆StringB开头的“@”s。

答案 4 :(得分:0)

StringC = StringA + StringB;怎么样。

对于StringA或StringB的任何组合,这保证是唯一的。或者您对字符串还有其他一些注意事项吗?

例如,您可以组合字符串并获取它的MD5哈希值。然后你会得到一个可能“足够独特”的字符串,但是你不能再将哈希值反转回字符串,但是你可以使用相同的字符串并确保生成的哈希值在下一次相同时使用

修改

我现在看到了你的编辑,但我觉得这只是在这种情况下首先对字符串进行排序的问题。像

这样的东西
StringC = StringA.CompareTo(StringB) < 0 ? StringA + StringB : StringB + StringA;

答案 5 :(得分:0)

你可以对它们进行排序并将它们连接起来,然后让它们说出第一个单词的长度。

那样f("one","two") = "onetwo3"f("two","one") = "onetwo3",没有其他组合可以产生那个唯一字符串,因为,e,g,"onet", "wo"会产生"onetwo4"

然而,对于相当长的字符串来说,这将是一个糟糕的解决方案。

你也可以做一些哈希码计算,比如这个

first.GetHashCode() ^ second.GetHashCode()

这将是相当独特的,但是,你不能保证唯一性。

如果OP提供了更多的上下文,那将是很好的,因为这听起来不是任何问题的合理解决方案。

答案 6 :(得分:0)

您可以使用x.GetHashCode()。这不能确保这将是独特的,但相当。查看更多信息in this question

例如:

public int GetUniqueValue(string x, string y)
{
    unchecked {
        var result = x.GetHashCode() * x.GetHashCode();
        return result;
    }
}

答案 7 :(得分:0)

在合并它们之前,请考虑每个字符串的第一个字母?因此,如果它按字母顺序排列,则f(x,y)= f(y,x)将为真。

if(x&gt; y)    c = x + y; 其他    c = y + x;

答案 8 :(得分:0)

public static String getUniqString(String x,String y){
    return (x.compareTo(y)<0)?(x+y):(y+x);
}