Hash 如何唯一地散列/模糊9-11个字符
我有以下格式的一系列代码:Hash 如何唯一地散列/模糊9-11个字符,hash,Hash,我有以下格式的一系列代码: AA12345A1 i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9] 及 i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9]{3} 我需要创建一个新的“代码”的任何格式,从上述任何一种格式到格式,以掩盖以1个数字结尾的代码和以3个数字结尾的代码之间的差异(这会向用户显示我需要隐藏的信息) 新代码格式的约束条件包括: 它们必须是人类可以使用的(因此使用大写和小写字母是一个坏主意,在可用性方面,它们也应该尽可能短) 它们必须始终是唯一的(
AA12345A1
i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9]
及
i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9]{3}
我需要创建一个新的“代码”的任何格式,从上述任何一种格式到格式,以掩盖以1个数字结尾的代码和以3个数字结尾的代码之间的差异(这会向用户显示我需要隐藏的信息)
新代码格式的约束条件包括:
- 它们必须是人类可以使用的(因此使用大写和小写字母是一个坏主意,在可用性方面,它们也应该尽可能短)
- 它们必须始终是唯一的(9或11个字符的代码不应产生相同的输出)
- 它只需要一个单向散列,我永远不需要得到原始代码回来
- 原始代码的长度(9或11个字符)不能太明显-它不需要加密能力强,只是对外行来说不透明
- 创建散列
- 以人类可用的形式表示
00001->“1”
…
01001->“9”
01010->“A”
…
11111->“Z”
表中没有使用可能会混淆的字母(例如,“L”==“L”可能会意外地被读为“1”;省略字母“Q”和“O”,因为您使用的是数字“0”)。您需要10位数字加22个字符
如果用户输入代码,请将所有小写字母替换为大写字母,例如“l”/“l”替换为“1”,因为这些字母必须是打字错误。如果可能,添加另外一个或两个字符作为校验和,以便您可以检查其他打字错误(替换为字符)。因此,您可以在前端显示错误消息,而无需执行任何解码/数据库查找 这里有一种可能性 对于九个字符的代码,在第一个数字后插入一个随机偶数字母(B、D、F……),在末尾插入两个随机数字 对于11个字符的代码,在第一个数字后插入一个随机奇数字母(a、C、E……),其余数字保持原样 在这两种情况下,您也可以ROT-13非噪声字母和ROT-5数字来进一步更改代码,尽管我不确定这对您的目的是必要的 这样,两种情况下都会得到一个12个字符的代码,如果需要,可以反转。它是人类可读的和独特的。正如你所说,这不是国家安全局级别的密码,但它应该能阻止随便的旁观者
如果需要生成更具确定性的结果(即,没有随机数)的散列,则可以使添加的内容依赖于输入数据。这里有一种方法,可能还有数百种。考虑两种输入类型:
AB12345C6
AB12345C678
在这两种情况下,仍然在1
后面插入一个字符,但使其取决于输入。将位置1
、3
和6
处的数字相加,取其模10得到0到9
将其用作9位代码的字符串“ABXVRWECPU”或11位代码的“OIYJTQLSDK”的查找,以获取字符。然后,您可以在生成的代码中使用该字符来确定最初是9个字符还是11个字符的代码(真正的偏执狂会确保这些字符串不会以明文形式存储在代码中)
对于要添加到第一种情况的两个数字,将A、C和B函数的ASCII码相加(例如,带147的异或'B',然后将其添加到由64、51和23组成的数字中
取其模-87,然后加7,得到一个介于7和93之间的值。一个非常简单的混淆方法是:
- 秘密地随机挑选字母表的一半表示9个字符,另一半表示11个字符
- 从正确的一半向字符串预加一个随机字母(即,如果是9个字符的字符串,则从9个字符的一半向字符串预加一个字母)
- 如果字符串为9个字符,则附加2个随机数字
不过,每一个字符串都会有12个字符。但是哈希本身并不能保证是唯一的。另一方面,SHA-1的长度超过11个字符(即使不考虑限制值),因此它实际上可能会对所有给定的输入哈希为唯一值。@Konrad:是的,不能保证它是唯一的。但是你可以计算概率,如果应用程序可以的话,它可以是一个解决方案,当知道另一个代码时,很难“猜测”一个代码。我同意。只有填充数字不能是随机的,而是一些散列(例如,总和%100)。此外,偶数和奇数字母可能很容易被发现。根据定义,如果输入相同,哈希函数总是给出相同的结果。使用随机数时,如果再次运行,哈希可能会不同。@Sjoerd,为什么不使用随机数?基于插入的alpha,它们只是被忽略了,所以它们是什么并不重要。如果你的意思是你想确保同一个来源给出相同的结果,我理解,但是这封信也不能是随机的。我将添加另一个更确定的哈希。@Sjoerd我同意偶数/奇数。我看不出随机数有什么问题,你不会因为增加了数字而产生冲突,因为字母表是9比11的一半codes@sjoerd:从这个问题来看,对我来说,真正的哈希并不是一个很难的要求@paxdiablo:当你这么做的时候,修复偶数/奇数字母的问题(有点太明显了)。此外,为了让它完全确定,你必须从字符串上的实际字符中推断出起始字母(可能使用类似CRC-128的东西会
AB12345C6
AB12345C678