Хранение подписи SHA1 в качестве первичного ключа в Postgres SQL - PullRequest
11 голосов
/ 28 октября 2009

Я пишу простую систему управления контентом. Мне нужно хранить хеш-значения SHA1, которые вычисляются извне, как первичный ключ для моей самой большой таблицы.

Я, очевидно, могу использовать последовательность в качестве первичного ключа и индексировать шестнадцатеричную строку SHA1 для поиска ... Однако я ищу более элегантное решение, в котором я просто буду использовать 20-байтовые вычисленные значения SHA1 в качестве заданного ключа для строк, которые я собираюсь вставить / удалить / обновить в таблице базы данных. Есть ли эффективный тип хранения, который я могу использовать для хранения, а затем использовать ключи SHA1 в качестве первичных ключей?

Мне, очевидно, понадобится postgres для поддержки использования 20-байтовых значений в качестве ключей, чтобы сделать это.

У кого-нибудь есть идеи?

Ответы [ 3 ]

5 голосов
/ 28 октября 2009

В частности, если вы будете вводить двоичные параметры в базу данных (например, через libpq), используйте bytea. Если вы хотите много манипулировать с помощью простых текстовых запросов, преобразуйте их в hext и сохраните в столбце text или varchar.

PostgreSQL, конечно, в общем случае не будет иметь проблем с 20-байтовыми ключами, за исключением того, что производительность, конечно, выше, чем с последовательностью.

2 голосов
/ 28 октября 2009

Вы можете либо преобразовать в hex или base64 и использовать столбец varchar, либо попробовать просто сохранить его в столбце с типом bytea. Я бы попробовал создать таблицы с кучей случайных значений в обоих форматах и ​​посмотреть, как они работают.

См. документы PostgreSQL по bytea для получения информации об этом типе.

1 голос
/ 28 октября 2009

Будьте осторожны с тем, что это может сделать с вашими индексными деревьями. Поскольку SHA1 не будет последовательным, ваши записи будут очень медленными из-за всех скачков на btree.

Если последовательность не будет работать, я обычно рекомендую последовательный GUID / UUID (см., Например, NEWSEQUENTIALID () SQL Server) некоторого вида.

Если вы захотите сделать SHA1 вашим первичным ключом после того, как узнаете об этом, вы можете преобразовать его в стандартный шестнадцатеричный формат, в котором обычно отображается SHA1 (его легко набирать). Я бы не рекомендовал двоичный формат, так как вы не сможете набрать его для отладки и т. Д.

...