2012-04-26 59 views
2

我需要單向散列字母數字+特殊字符(ascii)可變長度字符串(10-20個字符)。 輸出的長度應該是可變的,但最長不超過25個字符,字母數字和不區分大小寫。帶有可變長度字母數字輸出的單向散列

另外我不想產生碰撞,所以我需要一些無碰撞或至少沒有證明(但?)產生碰撞的東西。

+0

我認爲散列的全部要點是產生比原始數據更小的東西,您可以使用它作爲唯一足夠的標識符。所以碰撞總會發生。我認爲你想要的不是散列。 – johnnycrash 2012-06-03 04:24:38

+0

@johnnycrash散列應該更小,但這並不意味着它對控制散列大小沒有用處。布隆過濾器需要更改散列的長度。 – 2014-12-04 03:41:05

回答

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()進行調用的次數。 XOR使用rand()的最後一次調用的結果。由於rand()總是爲給定的種子生成相同的數字流,所以「hash」不會碰撞並且可以被解密。

如果你想散列是「單向」,那麼扔掉密鑰!

+0

謝謝!這是一個很好的起點。正如你在評論中提到的那樣,我想我是在錯誤的方向上尋找。 – 2012-06-29 11:13:52

相關問題