2012-04-28 57 views
2

我需要一個算法來生成一個獨特的散列,而不是必需的固定長度,對於一個整數來說,它獨立於數字的排列。如何讓不隨排列變化的數字具有散列?

就像123,321,312,213 ......的散列應該是一樣的。 (忽略前導零)

我試過的是將每個數字都提高到自身並總結。像,

Hash(321) = 3**3 + 2**2 + 1**1 

現在,我不知道它是否會產生collissions與否並沒有,當然,性能問題的大量涌現。任何替代品?

+3

A * hash *對於任何方式的衝突都是不安全的。你想做什麼? – 2012-04-28 20:31:17

+0

爲一個數字生成一個唯一的ID,以便它獨立於該數字的數字排列。 – Shubham 2012-04-28 20:35:17

+2

@Shubham:爲什麼不直接對數字進行排序,並將結果用作散列? – 2012-04-28 20:40:08

回答

5

一個選項:排序數字。 123,321,312和213全部轉到123.

另一種選擇:使用每個數字的計數向量作爲散列。 123,321,312和213全部轉到[0,1,1,1,0,0,0,0,0,0]。

+0

第二個看起來不錯。你確定不會有任何碰撞嗎? – Shubham 2012-04-28 21:01:04

+0

不,沒有。實際上,它在功能上與排序數字相同。 – duskwuff 2012-04-28 21:05:55

+0

這很好。謝謝您的幫助! – Shubham 2012-04-28 21:10:02

1

你只需要任何哈希函數(讓我們拿md5)和一種可交換地加入事物的方法。採取每個數字的散列,然後將它們與交換方法結合起來。例如,如果我選擇md5並添加,那麼我可以md5每個數字並添加結果散列。如果我選擇使用sha1和乘法,這會給我一個不同的結果,但它仍然會有你想要的屬性。碰撞的問題更難...

+0

一個MD5哈希是16字節長。當然,如果我加起來的散列(假設你是指從頭到尾加入),即使對於小整數,它也會變得非常長。 – Shubham 2012-04-28 20:40:43

+0

如果你想要任何「獨特性」的機會,它將會很大。 – RBarryYoung 2012-04-28 20:46:29

+0

這會變得怪異不僅很大。 – Shubham 2012-04-28 20:51:19

0

只需使用一個 交叉總和作爲算法