2010-11-16 61 views
0

我需要一个散列函数H(X),它满足以下条件:手动散列函数

(1)输入大约10个数字,输出大约10个数字。 (2)如果你改变X即使只是一个数字,你也会得到一个完全不同的H(X)。

(3)易于计算手动。人们将手工计算。我需要他们能够快速,无误地完成任务。

谢谢你的创意!

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

编辑:这是干什么用的?这是考试。学生将做计算并获得数字作为答案。我希望他们在测试过程中能够知道他们是否正确答案。所以这个想法是:将所有答案连接到一个数字X.然后计算H(X)。然后使用H(X)逐个解码一些代码,并获得一条表示您的正确性的短消息。我不希望他们在得到第一个答案后能够找出第四个答案。

+2

如果您的输入和输出尺寸相同,为什么需要散列函数? – 2010-11-16 01:03:30

+0

hm ...你如何快速计算10位数字的操作?计算器是否允许?如果您使用%运算符,则一个大的素数会起作用... – irrelephant 2010-11-16 01:05:59

+0

假定有十进制数字,将X.Bam的每个数字加1。不同的价值,保证没有碰撞。不是真正的哈希。 – jball 2010-11-16 01:08:14

回答

2

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

+0

这是一个很好的方向。但即使对于小数字来说,X^10有点难以计算。并且添加10个数字也不容易。 – user302099 2010-11-16 01:25:24

+1

你只需要计算一次。使用计算器并将其粘在粉笔板上。 – SingleNegationElimination 2010-11-16 01:31:13

+0

我明白了。但是,学生将不得不加起来10个数字,对吧? – user302099 2010-11-16 01:32:52

0

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

呃,好吧,我仍然会试试看。怎么样:

准备10个常数c_0, c_1, .. , c_9,每个有10位数。让他们成对的共素或somesuch。随机选择你的“散列输入”号码a。让用户计算a的数字s的总和。然后使用s的最后一个数字i来选择那些常数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。我甚至不认为在大多数情况下,即使是人类,都很难逆转。但这可能是一个开始。

2

散列函数(如MD5,SHA1等)是加密函数(通常是分组密码)和压缩函数的组合。因为你不需要压缩,所以最简单的构造就是计算输入数字和一些关键数字的按位模数。如果您可以为每个号码使用新密钥,您的代码将是牢不可破的(这称为一次性密码)。

这是戴维斯梅耶尔散列函数是如何工作的,其中E是一些加密功能,我是输入:

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

如果你把每个项目我是一个数字,你的加密(E )可以将该数字加到密钥mod 10并加1。

更复杂的块加密的基础是一些替换的排列(用其他替换数字或比特序列)和置换(交换数字或比特序列短语)小时。