2009-10-28 43 views
10

我在寫一個簡單的內容管理系統。 我需要存儲從外部計算出來的SHA1哈希值作爲我最大表的主鍵。在Postgres SQL中存儲SHA1簽名作爲主鍵

我明顯可以使用一個序列作爲主鍵和索引SHA1十六進制字符串進行查找...... 但是,我正在尋找一個更優雅的解決方案,我將簡單地使用20個字節SHA1計算出的值作爲我要在數據庫表中插入/刪除/更新的行的給定鍵。 是否有一種高效的存儲類型,可以用來存儲以後再使用SHA1密鑰作爲主鍵?

我顯然需要postgres來支持使用20字節的值作爲鍵來完成這個工作。

任何有任何想法的人?

+4

順便說一句,只要記住所有的散列鍵可能會碰撞,甚至SHA1。 – 2009-10-28 17:05:18

+0

我不擔心散列衝突與適當的SHA1實現:)請參閱http://stackoverflow.com/questions/297960/hash-collision-what-are-the-chances – wojo 2009-10-29 00:01:11

回答

1

要小心這可以做什麼你的索引btrees。由於SHA1不會是連續的,所以在btree中的所有跳轉都會導致寫入速度非常慢。

如果一個序列將無法正常工作,我通常會推薦順序GUID/UUID(請參閱SQL Server的NEWSEQUENTIALID()爲例)某種形式的。

如果你想使你的SHA1主鍵知道這一點後,你可以將其轉換爲SHA1是通常會顯示一個標準的十六進制格式(可以很容易地鍵入)。我不會推薦一個二進制格式,你將無法鍵入調試等

+7

寫入一個'B-Tree'無論如何,這將是連續的,它是搜索頁面鏈接,將跳轉。但是,即使分配值也會使樹更加平衡,搜索更快,而不是更慢。 – Quassnoi 2009-10-28 17:07:40

+1

我想我是指一些數據庫服務器根據聚集索引來排序頁面的方式,但這是SQL Server,我不知道它是否適用於pgsql。哼!但是你是對的,樹會很好地平衡(幾乎是完美的) – wojo 2009-10-28 17:20:17

+0

'@ wojo':即使在聚簇表中,「SQL Server」保持一個「B-Tree」順序,而不是物理順序。行不一定是物理排列的,只是邏輯上。 http://msdn.microsoft.com/en-us/library/ms177443(SQL.90).aspx – Quassnoi 2009-10-28 22:22:54

2

您可以將其轉換爲十六進制或base64並使用varchar列,或嘗試將其存儲在bytea型列中。我試着用這兩種格式的一堆隨機值製作表格,並看看它們的表現如何。

有關該類型的信息,請參閱the PostgreSQL docs on bytea

5

特別是如果你會做二進制參數到數據庫(通過libpq的舉例),使用BYTEA。如果您想通過簡單的文本查詢進行大量操作,請轉換爲hext並存儲在文本或varchar列中。當然

PostgreSQL將在一般沒有問題,20分字節的密鑰,比性能開銷,當然比用序列更大其他。