2011-10-18 104 views
2

我需要在數據庫中的md5哈希列上放置索引。我將在md5列上執行搜索。我打算將散列存儲爲CHAR(32),但我也看到了二進制列選項。將存儲一個md5哈希更好地在二進制列或char(32)中工作。我可以使用Linq to Entities查詢二進制列嗎?如果是這樣,我會怎麼做呢?Linq:如何在數據庫中存儲MD5哈希列

+0

技術上,而不是十六進制-ING的字節數組,你可以BASE64它('Convert.ToBase64String(字節)'),並獲得24個字節的字符串。 – xanatos

回答

5

如果您使用的SQLServer或支持128位的GUID類型的...你可以使用GUID類型來表達的MD5值,任何其他服務器。

由於MD5是16字節(128位),因此您可以輕鬆將其轉換爲GUID。 爲了在C#中做到這一點,您可以使用Guid結構和\或手工編寫簡單的轉換例程。

Guid的格式爲xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx其中x是一個十六進制字符,但內部存儲爲128位整數,因此它們佔用的空間非常小,對於查詢!

GUIDS作品比char或binary要好得多,它們是固定的大小,而且通常用作鍵\時,由於需要對他們非常高的速度和低空間消耗更多的比特指數,而不是INT。

+0

問題被標記爲sql-server-2008,所以是的。 :) – bzlm

+0

大聲笑是:)我試圖做一個更通用的答案:)抽象總是一件好事:d –

+0

wow..this是一個非常好的主意。我會執行這個。 – Luke101

0

如果索引相同,則選擇哪種類型並不重要,差異將存儲在存儲中。二進制類型可能會更小,而char類型會將值編碼爲整數。真的在一天結束的時候我會使用char,因爲它會更加寬容二進制文件。所以,除非你儲存了大量的這些數據,否則這不會產生太大的影響。至於LINQ,我不確定,但我很確定你可以,它只是字段而不是字段。這就是我要去char的另一個原因,它使得處理linq變得更容易。

+0

「字段而不是字段」? – bzlm

+0

啊,它剝離了我的部分answear,仍然是堆棧溢出的新手。在模板類中,應該有什麼比標誌更好。當您在數據集中引用linq中的字段時,可以指定數據來自的列的類型。這將是char,而不是二進制。 –

+0

你的意思是像'Field ()'而不是'Field ()'?不確定這裏有關。它是EF(L2E),而不是舊的ADO 2.0 Linq-to-DataSet的東西。 :) – bzlm

0

這實際上取決於你如何在代碼中表示你的散列。如果它是一個字節數組,請繼續並使用二進制數據庫類型。如果它是一個字符串,請使用它。無論哪種方式,它都是某種程度上的二進制數據,只是在向您顯示數據時告訴計算機如何解釋它。