2012-02-20 56 views
1

假設我使用這個代碼來生成散列:使用此散列創建策略是否可能發生SHA-512衝突?

static void Main(string[] args) { 

    string id = Guid.Parse("8681941A-76C2-4120-BC34-F800B5AAB5A5".ToLower()).ToString(); 
    string date = DateTime.Today.ToString("yyyy-MM-dd"); 

    Console.WriteLine(id); 
    Console.WriteLine(date); 

    using (System.Security.Cryptography.SHA512Managed hashTool = 
     new System.Security.Cryptography.SHA512Managed()) { 

     Byte[] PasswordAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(id, date)); 
     Byte[] EncryptedBytes = hashTool.ComputeHash(PasswordAsByte); 
     hashTool.Clear(); 

     Console.WriteLine(Convert.ToBase64String(EncryptedBytes)); 

    } 
    Console.ReadLine(); 
} 

在現實世界的例子,當你對樣品看,我會生成一個GUID和日期哈希值。我將從數據庫中獲取這些值。

用這種方法是否有可能使用不同的值得到相同的哈希結果?

編輯:

正如我指出,我會拉值形式的數據庫。正如你所猜測的,Guid是唯一的id關鍵字(如果我沒有遇到奇蹟,sql server會多次爲我生成相同的Guid)。日期時間值將是記錄的付款到期日。我在這裏演示了DateTime.Today,但我不會在產品上使用它。

+4

每個散列算法都可能遲早會發生碰撞,但在大多數情況下,「later」很長,所以你不應該關心它。 – zerkms 2012-02-20 20:54:50

+0

@zerkms謝謝!假設這是一個電子商務應用程序,我應該繼續不關心嗎? – tugberk 2012-02-20 20:56:48

+1

**投票重新開放。**這個問題有幾個屬性,使其與其他「可哈希函數相撞?」有趣和不同。問題,因爲我們在這裏也討論了hash的_inputs_。 – 2012-02-20 21:03:32

回答

1

對於在同一天被多次拉動的給定GUID,您肯定會得到一個哈希碰撞。例如,如果您爲特定GUID g生成哈希,則在2012年12月20日12:00在g處拉動g會產生與在18:00拉動它相同的哈希,因爲您只考慮日期,而不是時間。

對於不相關的GUID,仍有可能產生散列衝突。可能的哈希空間是64位,小於無窮大,這意味着依靠pigeonhole principle必然會有重複。然而,這是不太可能的 - 事實上,它是不太可能的,你應該把它作爲零。

+0

謝謝!正如我所指出的,我將把價值觀形式數據庫。正如你所猜測的,Guid是唯一的id關鍵字(如果我沒有遇到奇蹟,sql server會多次爲我生成相同的Guid)。日期時間值將是記錄的付款到期日。我在這裏用'DateTime.Today'來演示,但我不會在產品中使用它。 – tugberk 2012-02-21 08:08:27

0

與任何散列函數一樣,它可能發生的事情非常非常非常罕見。

一個好的散列函數會產生與兩個相鄰輸入不同的結果。 SHA512被認爲是一個很好的散列算法,所以它不應該成爲你的問題。

0

我不明白所有這些討論? 即使你有你的數據庫10萬個條目碰撞的機率是一樣

0.000000000003%(看,最多爲SHA256,所以SHA512的機會甚至更少)

即使你有100萬你不應該擔心它,如果你真的想確定,在文本之間插入一些東西,然後對它進行散列。

$newtext= wordwrap("mytexttexttext", 8, "myspliter", true); 
+0

當在PHP中引用的問題? – quantum 2012-10-21 04:06:31