【问题标题】:One way hash with variable length alphanumeric output具有可变长度字母数字输出的一种方式散列
【发布时间】:2012-04-26 13:17:16
【问题描述】:

我需要一种方法散列字母数字 + 特殊字符(ascii)可变长度(10-20 个字符)的字符串。 输出应为可变长度,但最长为 25 个字符,字母数字且不区分大小写。

我也不想产生碰撞,所以我需要一些无碰撞或至少未被证明(还没有?)的东西来产生碰撞。

【问题讨论】:

  • 我认为哈希的全部意义在于产生比原始数据更小的东西,您可以将其用作足够唯一的标识符。所以碰撞总会发生。我认为您想要的不是哈希。
  • @johnnycrash 哈希应该更小,但这并不意味着控制哈希大小没有用。布隆过滤器需要改变散列的长度。

标签: hash alphanumeric hash-collision variable-length


【解决方案1】:

Here 是很多关于不同哈希函数的好东西。我不认为任何人做你所要求的。它们都会发生碰撞。

也许你应该看看一些简单的加密算法。

这是一种简单的加密技术,可以满足您的需求:

char szInput = "hash me", szOutput[20], szKey = "foo";
int i, cbKey = strlen(szKey), cbInput = strlen(szInput);

for (i=0 ; i<cbInput ; ++i)
  szOutput[i] = szInput[i]^szKey[i%cbKey];  // xor with a differnt char from the key

您将无法识别输出并且它不会发生碰撞,因为它是可逆的。

另一种更难破译的方法是使用密钥中的当前字符作为调用 rand() 的计数。使用最后一次调用 rand() 的结果进行异或运算。由于 rand() 总是为给定种子生成相同的数字流,因此您的“哈希”不会发生冲突并且可以被解密。

如果您希望哈希是“单向”...那么请扔掉密钥!

【讨论】:

  • 谢谢!这是一个很好的起点。正如您在评论中提到的那样,我想我的搜索方向是错误的。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2017-03-05
  • 2020-05-01
  • 2019-03-20
相关资源
最近更新 更多