Algorithm 如何从用户输入中生成唯一字符串?
例如,用户可以提交Algorithm 如何从用户输入中生成唯一字符串?,algorithm,unique,uniqueidentifier,unique-key,Algorithm,Unique,Uniqueidentifier,Unique Key,例如,用户可以提交$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=”“/code>都会生成$uniq=AB | CD | EF 如何做到这一点?正确而安全的解决方案是为$a、$b和$c生成单独的散列值,然后通过连接
$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=”“/code>都会生成$uniq=AB | CD | EF
如何做到这一点?正确而安全的解决方案是为$a
、$b
和$c
生成单独的散列值,然后通过连接或生成另一个散列将这些散列组合在一起
下面是一个算法:
$a_h = hash($a)
$b_h = hash($b)
$c_h = hash($c)
$uniq = hash($a_h$b_h$c_h)
根据您的要求,可能还需要添加“salt”以使其更加安全:简单的解决方案:使用用户无法或不允许输入的分隔符-可能是控制字符。更复杂的是:在每个输入前加上自己的长度前缀(比如一个二进制字节,或者一个后跟冒号的十进制数,等等)。任何不允许用户输入的字符串都将起作用。这是一个众所周知的问题。考虑C字符串,在这里你必须“逃出”<代码> \ < /COD>字符。因此,如果您想打印字符串“\hello\”
,您可以编写put(“\\hello\”)
类似地,您可以使用|
字符分隔用户的输入,如果用户输入|
,则将其转换为|
。当然,如果输出唯一的字符串,则需要进行反向转换。哈希值不是唯一的值。多个字符串可以散列为同一个值。虽然出现重复的可能性很小,但这种可能性是存在的。@JimMischel当然,这就是为什么会有完美的哈希函数;)另一方面,考虑从用户输入的3倍100K(如您在评论中建议的)连接的唯一值…无论如何,使用适当的哈希函数比任何直接用户输入使用都更安全。。。