2017-06-12 115 views
1

相关:Generate a unique string based on a pair of strings基于一组有序的字符串生成直观的唯一字符串?

我要生成一个直观唯一的字符串来表示一个有序对字符串。

显然,stringA + stringB非常直观,但如果您考虑如"st" + "ring" == "stri" + "ng" == "string"则不是唯一的。

另外,不像链接的OP,我想有uniqueString(stringA, stringB) != uniqueString(stringB, stringA),即非交换。 类似MD5(stringA) - MD5(stringB)可能会考虑链接的OP,但我觉得这是非常不直观的。

任何想法?

+0

'MD5(A)+ MD5(A + B)'? –

+0

stringA.length + stringA + stringB?你可以很容易地再次将它分成两个字符串,如果一个或两个字符串都为空,它就可以工作。 – m69

+0

@StanislavKralin这会工作,但并不简单,因为我希望。 – akai

回答

1

编码长度Ò f将第一个字符串放入结果字符串中;这样,你就知道分裂的位置,“xy”+“z”与“x”+“yz”不同。
零填充长度,以便它始终具有相同的数字位数(取决于字符串的最大长度)。

实例(具有999的最大字符串长度):

"xxx" + "yyy" = "003xxxyyy" 
"xx" + "xyyy" = "002xxxyyy" 
"xxxyyy" + "" = "006xxxyyy" 
"" + "xxxyyy" = "000xxxyyy" 
"" + ""  = "000" 

替代地,如果该字符串的最大长度是未知的,则可以在长度后使用分隔符:

"xxx" + "yyy" = "3;xxxyyy" 

您不必为此使用特殊字符,也不必使用字符串中的分隔符,因为没有歧义:

"a;b" + ";c;" = "3;a;b;c;" = length + delimiter + "a;b;c;" 
0

这种感觉非常像序列化问题......将两个值放在同一个地方,然后仍然可以将它们分开。

其中一种最简单的方法是使用分隔符àla csvs,但这需要您实现唯一的字符或字符序列。

解决这个问题就像在字符串中的分隔符的所有实例之前加上一个'\'以及'\'的所有实例一样简单。

作为一个例子:

"hello, " + "wor\d" 
"hello\, " + "wor\\d" //Add in the escape characters 
"hello\, ,wor\\d" //Second comma is not escaped, parser knows to split the string back into two components there 
1

如果具有这样的问题的任务,我想尝试一个CSV式的方法,例如

  • stringA + stringB =>stringA;stringB

  • stringA + string;B =>stringA;"string;B"

  • stringA + string"B =>stringA;"string""B"

+0

看起来不错,但自己实现这个听起来超级错误容易。在任何语言中是否有任何参考实现或像csvConcat这样的函数? – akai

+0

我注意到我可以使用csv作家... – akai

+0

这似乎比只使用一个单一的转义字符,你也逃避,如',' - >'\,'和'\'更复杂和混乱 - >''''(如dornadigital的答案所示)。 – Dukeling

相关问题