2010-11-16 113 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。

更復雜的塊加密的基礎是一些替換的排列(用其他替換數字或比特序列)和置換(交換數字或比特序列短語)小時。