2009-10-28 15 views
10

Piszę prosty system zarządzania treścią. Potrzebuję przechowywać wartości mieszania SHA1, które są obliczane zewnętrznie jako klucz podstawowy dla mojej największej tabeli.Przechowywanie podpisu SHA1 jako klucza głównego w Postgres SQL

Oczywiście mogę użyć sekwencji jako klucza podstawowego i indeksować ciąg szesnastkowy SHA1 do wyszukiwania ... Jednak szukam bardziej eleganckiego rozwiązania, w którym po prostu użyję 20-bajtowego SHA1 wyliczył wartości jako dany klucz do wierszy, które zamierzam wstawić/usunąć/zaktualizować w tabeli bazy danych. Czy istnieje skuteczny typ pamięci, który można użyć do przechowywania, a następnie używać kluczy SHA1 jako kluczy podstawowych?

Oczywiście będę potrzebował postgrera do obsługi przy użyciu 20-bajtowych wartości jako kluczy do wykonania tego.

Ktoś ma jakieś pomysły?

+4

Btw, należy pamiętać, że wszystkie klawisze mieszające mogą się kolidować, nawet SHA1. –

+0

Nie martwię się o kolizje haszy z prawidłową implementacją SHA1 :) Zobacz http://stackoverflow.com/questions/297960/hash-collision-what-are-the-chances – wojo

Odpowiedz

1

Uważaj, co może zrobić z indeksami. Ponieważ SHA1 nie będzie sekwencyjny, twoje zapisy będą bardzo powolne ze względu na wszystkie skoki w btree.

Jeśli sekwencja nie działa, zazwyczaj zalecam sekwencyjny identyfikator GUID/UUID (patrz na przykład NEWSEQUENTIALID() programu SQL Server).

Jeśli chcesz, aby SHA1 był twoim kluczem podstawowym po tym, jak o tym wiesz, możesz przekonwertować go do standardowego formatu szesnastkowego, w którym zwykle jest pokazywany SHA1 (ułatwia pisanie). Nie polecałbym formatu binarnego, ponieważ nie będziesz mógł go wpisać do debugowania, itp.

+7

Zapisuje do 'B-Tree' będzie sekwencyjny i tak będzie wyszukiwanie stron, z którymi będzie się łączyć. Jednak nawet rozkład wartości sprawi, że drzewo będzie bardziej zrównoważone, a wyszukiwanie szybsze, a nie wolniejsze. – Quassnoi

+1

Chyba miałem na myśli sposób, w jaki niektóre serwery baz danych porządkują strony według indeksu klastrowego, ale to jest SQL Server, nie wiem, czy dotyczy to pgsql. Hmm! Ale masz rację, drzewo będzie bardzo dobrze zrównoważone (prawie idealnie). – wojo

+0

'@ wojo': Nawet z tabelami klastrowanymi,' SQL Server' zachowuje kolejność 'B-Tree', a nie porządek fizyczny. Wiersze niekoniecznie są uporządkowane fizycznie, tylko logicznie. http://msdn.microsoft.com/en-us/library/ms177443(SQL.90).aspx – Quassnoi

2

Można albo przekonwertować na hex lub base64 i użyć kolumny varchar, albo spróbuj po prostu zapisać w kolumnie bytea -typed. Próbowałbym tworzyć tabele z mnóstwem losowych wartości w obu formatach i sprawdzać, jak działają.

Aby uzyskać więcej informacji na temat tego typu, patrz .

5

Szczególnie jeśli będziesz robić parametry binarne w db (np. Przez libpq), użyj bytea. Jeśli chcesz wykonać wiele manipulacji za pomocą prostych zapytań tekstowych, przekonwertuj na szesnastkowy i przechowuj w kolumnie tekstowej lub varchar.

PostgreSQL oczywiście nie będzie miał żadnych problemów w ogóle z 20-bajtowymi kluczami, poza tym, że obciążenie związane z wydajnością jest oczywiście większe niż w przypadku sekwencji.

Powiązane problemy