Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于一对字符串生成唯一字符串_C#_String_Unique - Fatal编程技术网

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

C# 基于一对字符串生成唯一字符串,c#,string,unique,C#,String,Unique,我有两根弦,弦A,弦B。我想生成一个唯一的字符串来表示这对 i、 e 对于每个x,y和f(x,y)=f(y,x),f(x,y)应该是唯一的,其中x,y是字符串 有什么想法吗?关于StringC=StringA+StringB 这对于StringA或StringB的任何组合都是唯一的。或者您对字符串还有其他考虑吗 例如,您可以组合字符串并获取其MD5哈希值。然后,您将得到一个字符串,该字符串可能“足够独特”以满足您的需要,但您不能再次将哈希值反转回字符串中,但您可以使用相同的字符串,并确保下次生成

我有两根弦,弦A,弦B。我想生成一个唯一的字符串来表示这对

i、 e

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


有什么想法吗?

关于
StringC=StringA+StringB

这对于StringA或StringB的任何组合都是唯一的。或者您对字符串还有其他考虑吗

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

编辑

我现在看到了您的编辑,但我觉得在这种情况下,只需要先对字符串进行排序。大概是

StringC = StringA.CompareTo(StringB) < 0 ? StringA + StringB : StringB + StringA;
StringC=StringA。与(StringB)相比<0?StringA+StringB:StringB+StringA;

您只需对它们进行排序并将它们连接起来,再加上第一个单词的长度

这样的话,
f(“一”、“二”)=“onetwo3”
f(“二”、“一”)=“onetwo3”
,没有其他组合会产生唯一的字符串,例如,
“onet”、“wo”
会产生
“onetwo4”

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

你也可以做一些散列码计算,像这样

first.GetHashCode() ^ second.GetHashCode()
这将是相当独特的,然而,你不能保证独特性


如果OP提供了更多的上下文,那就太好了,因为这听起来不像是解决任何问题的好办法。

只要找到一种独特的方式对它们进行排序,并用分隔符连接即可

def uniqueStr(strA,strB,sep):
    if strA <= strB:
        return strA+sep+strB
    else:
        return strB+sep+strA
优选地,如果字符串很长或分隔符选择有问题,则使用散列并散列结果:

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

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

MD5(x) ^ MD5(Y)
消息摘要为每个字符串提供唯一的值,XOR使f(x,y)等于f(y,x)成为可能


EDIT:正如@Phil H所观察到的,您必须处理这样一种情况:您收到两个相等的字符串作为输入,这将在XOR之后生成0。如果x和y相同,则可以返回类似于
MD5(x+y)
的值,对于其余的值,可以返回
MD5(x)^MD5(y)

我认为下面应该会产生唯一的字符串:

String f = Replace(StringA<StringB?StringA:StringB,"@","@@") + "}@{" + Replace(StringA<StringB?StringB:StringA,"@","@@")
String f=Replace(StringA您可以使用x.GetHashCode()。这并不能确保它是唯一的,但却非常独特。请参阅更多信息

例如:

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

在组合它们之前,我们会考虑每个字符串的第一个字母,所以如果它是按字母顺序排列的f(x,y)=f(y,x)将为真

如果(x>y) c=x+y; 其他的
c=y+x;

只需创建一个新类并重写
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();
    }
}
公共静态字符串getUniqString(字符串x,字符串y){

return(x.compareTo(y)你能举个例子吗?到目前为止你尝试了什么?我不是一个构建逻辑来获得这样一个唯一值的人。我想要f('ABC','DEF')='someuniquevalue'=f('DEF','ABC'),现在我想定义f。你计划在.NET之外使用这个
someuniquevalue
(即作为数据库PK)否则,我认为我的答案是最简单直接的。这不是唯一的。一对可以是“AB”和“A”,另一对可以是“A”和“BA”。不,他希望StringC是一样的,不管A或B排在第一位,但f(x,y)=f(y,x)不会是真的吗?@All-我在看到OP的评论之前发布了我的答案。我现在已经对我的答案进行了编辑。斯维科说(见@Phil H的答案):“onesep”,“two”产生的结果与“one”,“septwo”相同:
“onesep”,“two”产生的结果与
“one”,“septwo”
产生的结果相同:)必须选择分隔符,使其不是字符串中的有效字符。@SWeko:添加了哈希连接版本,以消除对分隔符的需要,并返回一个固定大小的字符串。这只是合理的唯一性,而不是真正的唯一性,因为根据定义,任何哈希算法都可以为不同的输入生成相同的输出。on唯一的问题是MD5(x)^MD5(x)=0-所以对任何一对匹配的字符串都会得到相同的结果。@Phil H:你是对的!f(x,x)和f(y,y)应该被视为特例。谢谢你发现了这一点。@SWeko:MD5生成128位,所以对不同的字符串可以有相同的结果。我只是为了简单起见使用了它们(每个人都知道MD5的功能)。如果需要,可以使用更强大的消息摘要算法抱歉!我没有阅读所有答案。不幸的是,我的答案是@Phil H答案的副本。
*
组合多个哈希代码通常是一个错误的选择-如果一个字符串的代码为0,那么另一个字符串的代码是什么并不重要,因此所有这些对都会冲突。此外,您还需要将其包装在
未选中的
块中,以防止溢出。例如,请参阅此问题的答案:@Damien_the_unsiever:一般来说,您是对的,但是:(1)字符串哈希方法不太可能产生0。(2)必须使用与顺序无关的运算符,如+或*(您有更好的运算符吗?)当然,您需要将其预执行为
未选中
,并检查空引用(毕竟string是一个对象),并使用比
StringA
更好的名称,但我想为NLV留下一些工作。否则,他该如何度过余下的一天:)我意识到没有完美的解决方案可以为一对字符串生成唯一的字符串,这里提供的所有解决方案都接近完美。正如Sweko所说,这不是解决任何问题的好方法,我已将解决方案的逻辑更改为我的问题,以避免这种情况:)。
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();
    }
}
public static String getUniqString(String x,String y){
    return (x.compareTo(y)<0)?(x+y):(y+x);
}