手动哈希函数

时间:2010-11-16 01:01:20

标签: hash

我需要哈希函数H(X),实现以下目的:

(1)输入大约10位数字,输出大约10位数。

(2)如果你改变X甚至只是一个数字,你得到一个完全不同的H(X)。

(3)易于计算手动。人们会用手来计算它。我需要他们能够快速做到并且没有错误。

感谢您的创意!

编辑:通过“哈希”我的意思是“单向哈希”的精神。那就是 - 给定H(X),很难找到X的可能值。对于人来说很难。

修改:这是为了什么?这是一个考试。学生将进行计算并获得数字作为答案。我希望他们能够在测试期间知道他们是否得到了所有答案。所以这个想法是:将所有答案连接到一个数字X.然后计算H(X)。然后使用H(X)解码一些代码,逐位数字,并得到一条指示正确性的短消息。我不希望他们在得到第3个答案之后能够找出第4个答案。

3 个答案:

答案 0 :(得分:2)

每个数字是多项式的系数:即1234是1 * x ^ 3 + 2 * x ^ 2 + 3 * x + 4。计算某些预定X的多项式的值,比如987654321,并将其截断为所需的位数。

答案 1 :(得分:2)

哈希函数(如MD5,SHA1等)是加密函数(通常是分组密码)和压缩函数的组合。

由于您不需要压缩,最简单的构造是计算输入数字的按位模数和一些关键数字。如果你可以为每个数字使用一个新密钥,那么你的代码将是牢不可破的(这称为一次性密码)。

这就是Davies-Meyer哈希函数的工作原理,其中E是一些加密函数,我是输入:

H[0] = <SOME CONSTANT>
for (i in I[1:])
   H[i] = H[i-1] mod E(H[i-1] with key I[i])

如果您将I中的每个项目都作为一个数字,您的加密(E)可能是将数字添加到密钥mod 10并添加1。

更复杂的块加密的基础是一些替换排列(用其他替换数字或位序列)和置换(在短语内交换数字或位序列)h。

答案 2 :(得分:0)

我最好的猜测是,这将是某种CAPTCHA系统或数学难题。但我认为,如果不是不可能的话,构建一个遵守所有三个规则的功能将会非常困难。如果每个数字应该独立地影响每个其他数字,那将产生10 ^ 2个依赖性。

呃,不管怎样,我还是试一试。怎么样:

准备10个常数c_0, c_1, .. , c_9,每个都有10位数字。让他们成对联合或某些。随机选择“哈希输入”编号a。让用户计算s的数字a的总和。然后使用i的最后一个数字s来选择其中一个常量c_i。哈希结果b等于a + c_i

示例:

c_0 = 4729703658
c_1 = 5793154234
c_2 = 0362709821
...
a = 8243047067
s = 41
i = 1
b = a + c_1 = 14036201301

更改单个数字:

a = 7243047067
s = 40
i = 0
b = a + c_0 = 11972750725

很明显,该系统不适用于任何类型的加密应用程序。它也像CAPTCHA一样容易打破。在大多数情况下,即使对于人类来说,我也不认为反转太难。但这可能是一个开始。