2009-10-28 20 views
10

Sto scrivendo un semplice sistema di gestione dei contenuti. Ho bisogno di memorizzare i valori di hash SHA1 che sono calcolati esternamente come chiave primaria per la mia tabella più grande.Memorizzazione della firma SHA1 come chiave primaria in Postgres SQL

Posso ovviamente usare una sequenza come chiave primaria e indicizzare la stringa esadecimale SHA1 per la ricerca ... Tuttavia, sto cercando una soluzione più elegante, dove userò semplicemente il 20-byte SHA1 valori calcolati come chiave data per le righe che sto per inserire/cancellare/aggiornare nella tabella del database. Esiste un tipo di archiviazione efficiente che posso utilizzare per archiviare e in seguito utilizzare i tasti SHA1 come chiavi principali?

Avrò ovviamente bisogno di postgres per supportare l'utilizzo di valori a 20 byte come chiavi per ottenere questo risultato.

Chiunque abbia qualche idea?

+4

Btw, tieni presente che tutte le chiavi di hash potrebbero scontrarsi, anche SHA1. –

+0

Non mi preoccuperei delle collisioni di hash con un'implementazione corretta di SHA1 :) Vedi http://stackoverflow.com/questions/297960/hash-collision-what-are-the-chances – wojo

risposta

1

Prestare attenzione a ciò che questo può fare per i vostri indici. Dal momento che SHA1 non sarà sequenziale, le tue scritture saranno molto lente a causa di tutti i salti intorno all'asse.

Se una sequenza non funziona, di solito consiglierei un GUID/UUID sequenziale (vedere ad esempio NEWSEQUENTIALID di SQL Server()).

Se si desidera rendere SHA1 la chiave primaria dopo aver saputo ciò, è possibile convertirlo in un formato esadecimale standard in cui viene solitamente visualizzato SHA1 (facilita la digitazione). Non consiglierei un formato binario in quanto non sarà possibile digitarlo per il debug, ecc.

+7

Scrive su un 'B-Tree' sarà sequenziale in ogni caso, è la ricerca della pagina con cui collegarsi salterà intorno. Tuttavia, anche la distribuzione dei valori renderà l'albero più bilanciato e la ricerca più veloce, non più lenta. – Quassnoi

+1

Suppongo che mi stavo riferendo al modo in cui alcuni server di database ordinano le pagine in base all'indice cluster, ma quello è SQL Server, non so se si applica a pgsql. Hmm! Ma hai ragione, l'albero sarà bilanciato molto bene (quasi perfettamente) – wojo

+0

'@ wojo': Anche con le tabelle cluster,' SQL Server' mantiene un ordine 'B-Tree', non l'ordine fisico. Le righe non sono necessariamente ordinate fisicamente, solo logicamente. http://msdn.microsoft.com/en-us/library/ms177443(SQL.90).aspx – Quassnoi

2

È possibile convertire in esadecimale o base64 e utilizzare una colonna varchar oppure provare semplicemente a memorizzarla in una colonna di tipo bytea. Proverei a creare tabelle con un sacco di valori casuali in entrambi i formati e vedere come si comportano.

Vedere the PostgreSQL docs on bytea per informazioni su quel tipo.

5

In particolare se si eseguono parametri binari nel db (tramite libpq ad esempio), utilizzare bytea. Se si desidera eseguire molte manipolazioni tramite semplici query di testo, convertire in hext e archiviare in una colonna di testo o varchar.

PostgreSQL ovviamente non avrà problemi in generale con le chiavi da 20 byte, a parte il fatto che l'overhead delle prestazioni è ovviamente maggiore rispetto a una sequenza.

Problemi correlati