2014-10-29 112 views
0

我想在我的數據庫表中使用文件路徑作爲鍵。但使用長字符串作爲鍵不是一種有效的方法。如何從長字符串中生成唯一值以用作表鍵?

所以我想過要減小路徑的大小。 Object.GetHashCode()看起來不錯,特別是當它返回一個int

var key = path.GetHashCode(); 

但它被寫入在文件中:

的哈希代碼是用於是基於哈希表中 集合高效地插入和查找。散列碼不是 永久值。出於此原因:

  • 不要序列化哈希碼值或將它們存儲在數據庫中。
  • 不要使用哈希代碼作爲從鍵控集合中檢索對象的鍵。

那麼如何縮短路徑字符串以便在DataBase中用作表鍵?

+0

爲什麼不只是使用'Guid'? – 2014-10-29 15:32:17

+0

此表中的數據類型是什麼?它需要與其他表有關係嗎? – juharr 2014-10-29 15:33:12

+0

@BenRobinson我正在使用SQLite,並沒有那麼快。其他表也取決於文件路徑,所以我想通過使用路徑作爲密鑰來減少訪問數據庫的次數 – user3293835 2014-10-29 15:35:39

回答

4

不要。您可以使用相當長的字符串作爲基於查找的結構的鍵,而不會出現實際問題。基於散列或排序數據結構的整個設計是爲了避免在搜索結構時實際比較大量對象。

如果你使用某些東西來「縮短」字符串,你有兩個選擇,假設所有縮短的字符串都是唯一的,這意味着你的代碼在碰撞時不能正常工作,或者跟蹤真正的字符串以及縮短的字符串,並使用真正的字符串來處理衝突。後者正如Dictionary已經在爲其所有鍵所做的那樣,並且數據庫索引將做一些可比較的事情,所以你沒有理由重新實現它。

+0

謝謝@Servy。我將使用路徑作爲關鍵字,看看有什麼進來:)我認爲這是合理的,因爲行將只有成千上萬。 – user3293835 2014-10-29 15:43:12

0

使用標識列創建代理鍵。您仍然可以在文件路徑上編制索引或設置唯一的約束。

相關問題