【问题标题】:How to generate unique string from users input?如何从用户输入生成唯一字符串?
【发布时间】:2018-04-10 02:12:50
【问题描述】:

例如,用户可以提交$a、$b 和$c。我需要从这些输入中创建一个唯一的字符串。

如果我使用$uniq = $a$b$c,输入$a=AB, $b=CD, $c=EF 和$a=A, $b=BCD, $c=EF 都会生成$uniq=ABCDEF。

如果我使用$uniq = $a|$b|$c,那么$a=AB, $B=CD, $c=EF| 和$a=AB|CD, $b=EF, $c="" 都会生成$uniq=AB|CD|EF|

我该怎么做?

【问题讨论】:

  • 简单的解决方案:使用用户无法或不允许输入的分隔符 - 也许是控制字符。更复杂:为每个输入添加自己的长度(作为单个二进制字节,或十进制数字后跟冒号等)。
  • 正如@jasonharper 所说,但您不需要选择单个字符分隔符。任何不允许用户输入的字符串都可以使用。
  • 这是一个众所周知的问题。考虑 C 字符串,您必须在其中“转义”'\' 字符。所以如果你想打印字符串"\hello\",你写puts("\\hello\\");同样,你可以用|字符分隔用户的输入,如果用户输入一个|,你将它转换为||。当然,如果你输出了唯一的字符串,你会想要进行反向转换。

标签: algorithm unique uniqueidentifier unique-key


【解决方案1】:

正确且安全的解决方案是为 $a、$b 和 $c 生成单独的哈希值,然后通过连接或生成另一个哈希将这些哈希组合在一起。

这是一个算法:

$a_h = hash($a)
$b_h = hash($b)
$c_h = hash($c)
$uniq = hash($a_h$b_h$c_h)

根据您的要求,可能还需要添加“盐”以使其更加安全:https://en.wikipedia.org/wiki/Salt_(cryptography)

【讨论】:

  • 哈希不是唯一值。多个字符串可以散列到相同的值。虽然重复出现的可能性很小,但这种可能性是存在的。
  • @JimMischel 当然,这就是为什么有完美的散列函数的原因;)另一方面,考虑从 3 倍 100K 的用户输入(正如您在评论中建议的那样)连接的唯一值。 . 无论如何,使用适当的散列函数比任何直接用户输入使用更安全...
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多