Là sử dụng băm cho các khóa chính là một ý tưởng tốt?


8

Các CMND điện tử Áo dựa trên định danh ngành cái gọi là. Ví dụ, một bệnh viện sẽ xác định một người bằng cách lấy sectorId cho người đó, được tính toán như sau:

sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant

Đó có phải là một ý tưởng tốt? Tôi nghĩ rằng khả năng va chạm, dù nhỏ đến đâu, đều có rủi ro.

Trong hashtables, khi có xung đột, bạn có các phương tiện khác để thiết lập sự bình đẳng, nhưng với các khóa chính, bạn không thể có hai khóa giống hệt nhau. Điều đó có thể bị phá vỡ bởi một khóa tổng hợp, nhưng sau đó điểm của một định danh khu vực duy nhất bị mất.

Có ổn không khi làm điều đó và có một cách tốt để có nó theo cách đó mà không bị phá vỡ tại một số điểm?


Ngay cả khi thuật toán này tạo ra một bản sao, không có kiểm tra nào khác trong một hệ thống sẽ có các chỉ mục không cho phép trùng lặp? Nếu tôi đến một bệnh viện khác mà không có chứng minh thư, tôi sẽ không có cách nào khác để tra cứu một cá nhân ngoài số này chứ?
JeffO

8
Điểm quan trọng trong việc sử dụng thuật toán băm là gì? personalId+ sectorIDsẽ đóng vai trò là một định danh duy nhất và vì không có gì trong đó giống như mật khẩu phải được ẩn, nên băm dường như không được sử dụng thực tế. Tôi đang thiếu gì? Hay là "personID" gì đó bí mật?
Doc Brown

Tại sao bạn lại tin tưởng một UUID mà thông thường (V4) bao gồm 122 bit ngẫu nhiên trên 160 bit có? Va chạm ngẫu nhiên rõ ràng sẽ hiếm hơn cho sau này.
CodeInChaos

@DocBrown Tôi đã tò mò về điều đó bản thân mình. Vì vậy, tôi tìm thấy và liên kết nó ở trên. Tôi đã mất hứng thú sau khoảng 10 giây, vì vậy tôi vẫn không hoàn toàn chắc chắn tôi thấy được điểm này ... nhưng, nó có liên quan đến quyền riêng tư ... tôi nghĩ vậy.
Svidgen

Nếu bạn chọn một hàm băm tốt hơn thì không có con người nào trên hành tinh này biết cách tạo ra ngay cả một vụ va chạm. Nhiều người đã thử.
usr

Câu trả lời:


8

Bài viết trước đây của SO này cho bạn biết cách tính xác suất va chạm. Đối với SHA-1, b là 160. Số người sống ở Úc dưới 10 triệu. Ngay cả khi mỗi người sống trong austria được đăng ký trong một bệnh viện có ID người / ngành duy nhất, điều đó chỉ khiến xác suất va chạm nhỏ hơn 3.5 x 10^-35. Tôi đoán rằng nên đủ nhỏ cho hầu hết các mục đích thực tế.


1
Chà, bạn có chắc rằng cuộc tranh luận sẽ có sức nặng với bồi thẩm đoàn khi nói về sự sống và cái chết?
Ded

1
@Ded repeatator: Tôi đoán khả năng xảy ra va chạm do lỗi phần cứng (một số bit bị lật trong RAM hoặc bộ lưu trữ từ tính) hoặc lỗi của con người (ví dụ: lỗi đánh máy) sẽ cao hơn nhiều, không phụ thuộc vào loại ID hoặc băm nào Được sử dụng. Nhưng tất nhiên, một pettifogger có thể thấy điều này khác.
Doc Brown

Quan điểm của tôi là bất kỳ luật sư nào cũng có khả năng là một ... ;-)
Ded repeatator

3

Băm chắc chắn sẽ va chạm nếu chúng nhỏ hơn tất cả các kết hợp dữ liệu có thể.

Xem câu trả lời tuyệt vời này: https://softwareengineering.stackexchange.com/a/145633

Nếu các khóa chính không được coi là có ý nghĩa (con người có thể đọc được; chứa các đặc điểm có thể truy xuất được của dữ liệu), tôi sẽ chỉ sử dụng GUID.

Vâng, về mặt lý thuyết chúng cũng có thể va chạm, nhưng cái chết nhiệt của vũ trụ có thể xảy ra đầu tiên. Xem https://stackoverflow.com/a/184897


EDIT: giải quyết các điểm đối lập của @ DocBrown để làm sáng tỏ mọi thứ (và để tránh thảo luận dài dòng trong các bình luận)

Việc tạo định danh từ id người hoặc id ngành không phải là yêu cầu của OP (thực sự, anh ấy thừa nhận rằng việc dùng đến GUID là những gì anh ấy tự đề xuất).

Tôi chưa bao giờ tuyên bố GUID phù hợp như một sự thay thế tổng thể cho SHA-1 hoặc nói chung là băm (tất nhiên là không), tôi chỉ nói rằng chúng có thể được sử dụng trong trường hợp cụ thể này - để xác định duy nhất một số thực thể. Vì đây là những gì họ định nghĩa.

Nó không bao giờ là một yêu cầu mà các định danh này phải được xây dựng lại từ dữ liệu (đó là một lợi thế của hàm băm). Vui lòng đánh giá câu trả lời của tôi trong bối cảnh câu hỏi thực tế.


@Bozho Tôi nghĩ đề xuất của bạn là tốt như nó được. Sử dụng mã định danh 128 bit ngẫu nhiên giúp mọi thứ đơn giản (cộng lớn) và bạn luôn có thể đặt tiền tố cho các giá trị này bằng một cái gì đó có ý nghĩa nếu bạn muốn. Nhược điểm duy nhất là các giá trị kết quả sẽ dài, nhưng tốt, bạn không thể có mọi thứ. Tôi cho rằng dù sao chúng cũng sẽ không hiển thị với bất kỳ ai - không được sử dụng vì một số mã PIN mọi người dự kiến ​​sẽ trích dẫn qua điện thoại.
Konrad Morawski

2
GUID có 128 bit, SHA1 tạo đầu ra 160 bit. Vậy điều gì khiến bạn tin rằng GUID là sự lựa chọn tốt hơn so với SHA1 băm mà OP đề cập trong câu hỏi của anh ấy?
Doc Brown

1
@DocBrown Tôi thừa nhận không phải là chuyên gia trong lĩnh vực này, nhưng bản thân độ dài đầu ra không phải là vấn đề, bất kỳ hàm băm nào vẫn sẽ trả về cùng một đầu ra cho cùng một đầu vào (đó là loại điểm). Nếu personalId + "+" + prefix + sectorIdđược đảm bảo là duy nhất, thì có lẽ nó thậm chí có thể được sử dụng thô, tại sao không, SHA1 không thêm bất kỳ tính độc đáo nào. Vấn đề - theo tôi hiểu - là công thức này có thể không mang lại kết quả đầu ra duy nhất, đặc biệt là nếu hệ thống dự kiến ​​sẽ hoạt động trong một thời gian dài (lý do bảo trì có thể yêu cầu, ví dụ như thêm ID ngành - khuyến cáo thận trọng)
Konrad Morawski

5
Tôi vẫn không hiểu làm thế nào GUID được sử dụng ở đây. Sử dụng GUID không phải là thuật toán băm, GUID không thể được tạo từ personID / sectorID. Nó có thể được sử dụng thay thế cho trường hợp sau nếu thế hệ ID người duy nhất sẽ là một vấn đề khác (mà tôi đoán là không), nhưng nó không phải là sự thay thế cho thứ gì đó như SHA-1.
Doc Brown

1
IMHO GUID không giải quyết được vấn đề của OP. GUID rất hữu ích để tạo các số nhận dạng duy nhất theo cách phi tập trung - "sổ đăng ký cơ sở của Áo" là một tổ chức tập trung khá nhiều, họ không gặp phải vấn đề đó - mã cá nhân + mã ngành đã là một ID duy nhất, tại sao làm cho nó phức tạp hơn? Câu hỏi thú vị là: tại sao họ áp dụng băm? Nhưng đó là điều tôi mong đợi OP sẽ nói với chúng tôi.
Doc Brown

0

Sử dụng Hash hoặc GUID làm Khóa chính cũng là ý tưởng tồi vì nó gây ra Phân mảnh chỉ mục và phân chia trang thường xuyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.