2009-10-28 16 views
10

Tôi đang viết một hệ thống quản lý nội dung đơn giản. Tôi cần lưu trữ các giá trị băm SHA1 được tính bên ngoài làm khóa chính cho bảng lớn nhất của tôi. Tôi rõ ràng có thể sử dụng một chuỗi như là một khóa chính và chỉ mục chuỗi SHA1 hex để tra cứu ... Tuy nhiên, tôi đang tìm kiếm một giải pháp thanh lịch hơn, nơi tôi sẽ chỉ đơn giản sử dụng 20-byte SHA1 tính các giá trị như khóa đã cho cho các hàng mà tôi sắp chèn/xóa/cập nhật trong bảng cơ sở dữ liệu. Có loại lưu trữ hiệu quả nào tôi có thể sử dụng để lưu trữ và sau này sử dụng các phím SHA1 làm khóa chính không?Lưu trữ chữ ký SHA1 làm khóa chính trong Postgres SQL

Tôi rõ ràng sẽ cần postgres để hỗ trợ sử dụng giá trị 20 byte làm khóa để thực hiện việc này.

Bất kỳ ai có ý tưởng nào?

+4

Btw, chỉ cần nhớ rằng tất cả các khóa băm có thể va chạm, thậm chí SHA1. –

+0

Tôi sẽ không lo lắng về việc va chạm băm với việc triển khai đúng SHA1 :) Xem http://stackoverflow.com/questions/297960/hash-collision-what-are-the-chances – wojo

Trả lời

1

Hãy cẩn thận với những gì điều này có thể làm với chỉ số btrees của bạn. Kể từ khi SHA1 sẽ không được tuần tự, viết của bạn sẽ rất chậm do tất cả các nhảy xung quanh trong btree.

Nếu chuỗi không hoạt động, tôi thường khuyên bạn nên sử dụng GUID/UUID tuần tự (xem ví dụ về NEWSEQUENTIALID() của SQL Server).

Nếu bạn muốn biến SHA1 thành khóa chính sau khi biết điều này, bạn có thể chuyển đổi nó thành định dạng hex chuẩn mà SHA1 thường được hiển thị (giúp bạn dễ dàng nhập). Tôi sẽ không đề xuất định dạng nhị phân vì bạn sẽ không thể nhập định dạng này để gỡ lỗi, v.v.

+7

Ghi vào một 'B-Tree' sẽ được tuần tự anyway, đó là việc tìm kiếm các trang để liên kết với điều đó sẽ nhảy xung quanh. Tuy nhiên, thậm chí phân phối các giá trị sẽ làm cho cây cân bằng hơn và tìm kiếm nhanh hơn, không chậm hơn. – Quassnoi

+1

Tôi đoán tôi đã đề cập đến cách một số máy chủ cơ sở dữ liệu đặt hàng các trang theo chỉ số nhóm, nhưng đó là SQL Server, tôi không biết nếu nó áp dụng cho pgsql. Hmm! Nhưng bạn nói đúng, cây sẽ được cân bằng rất tốt (gần như hoàn hảo) – wojo

+0

'@ wojo': Ngay cả với các bảng được nhóm,' SQL Server' giữ thứ tự 'B-Tree', không phải thứ tự vật lý. Các hàng không nhất thiết phải được đặt hàng về mặt vật lý, chỉ một cách hợp lý. http://msdn.microsoft.com/en-us/library/ms177443 (SQL.90).aspx – Quassnoi

2

Bạn có thể chuyển đổi thành hex hoặc base64 và sử dụng cột varchar hoặc thử lưu trữ cột trong cột bytea. Tôi sẽ thử làm cho các bảng với một loạt các giá trị ngẫu nhiên trong cả hai định dạng và xem cách chúng thực hiện.

Xem the PostgreSQL docs on bytea để biết thông tin về loại đó.

5

Đặc biệt nếu bạn sẽ thực hiện tham số nhị phân vào db (thông qua libpq chẳng hạn), hãy sử dụng bytea. Nếu bạn muốn thực hiện rất nhiều thao tác thông qua các truy vấn văn bản đơn giản, chuyển đổi thành hext và lưu trữ trong một cột văn bản hoặc varchar.

Tất nhiên, PostgreSQL sẽ không gặp vấn đề gì với khóa 20 byte, ngoài ra, chi phí thực hiện của khóa học lớn hơn một chuỗi.

Các vấn đề liên quan