Apakah menggunakan hash untuk kunci primer adalah ide yang bagus?

8

The Austria KTP elektronik bergantung pada pengidentifikasi sektor disebut. Misalnya rumah sakit dapat mengidentifikasi seseorang dengan mendapatkan sectorId untuk orang tersebut, yang dihitung secara kasar sebagai berikut:

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

Apakah itu ide yang bagus? Saya pikir kemungkinan tabrakan, sekecil apa pun, menimbulkan risiko.

Dalam hashtables, ketika ada tabrakan, Anda memiliki cara lain untuk membangun kesetaraan, tetapi dengan kunci utama Anda tidak mungkin memiliki dua yang identik. Itu bisa dielakkan dengan kunci komposit, tetapi kemudian titik pengidentifikasi sektor unik hilang.

Apakah boleh melakukan itu dan apakah ada cara yang baik untuk melakukannya tanpa melanggar pada titik tertentu?

Bozho
sumber
Sekalipun algoritme ini membuat duplikat, apakah tidak ada pemeriksaan lain dalam sistem yang akan memiliki indeks yang tidak memungkinkan duplikat? Jika saya pergi ke rumah sakit lain tanpa kartu ID saya, tidak akan ada cara lain untuk mencari seseorang selain nomor ini?
JeffO
8
Apa gunanya menggunakan algoritma hash sama sekali? personalId+ sectorIDakan berfungsi sebagai pengidentifikasi unik, dan karena di sana tidak ada kata sandi yang harus disembunyikan, hashing sepertinya tidak ada gunanya. Apa yang saya lewatkan? Atau "personID" itu sesuatu yang rahasia?
Doc Brown
Mengapa Anda mempercayai UUID yang biasanya (V4) terdiri dari 122 bit acak lebih dari 160 bit? Tabrakan tidak disengaja jelas akan lebih jarang terjadi untuk yang terakhir.
CodesInChaos
@DocBrown Saya ingin tahu tentang itu sendiri. Jadi, saya menemukan dan menautkannya di atas. Saya kehilangan minat setelah sekitar 10 detik, jadi saya masih tidak sepenuhnya yakin saya mengerti intinya ... tapi, itu ada hubungannya dengan privasi ... saya pikir.
svidgen
Jika Anda memilih hash yang lebih baik maka tidak ada manusia di planet ini yang tahu cara membuat bahkan satu tabrakan. Banyak yang sudah mencoba.
usr

Jawaban:

8

Artikel SO mantan ini memberitahu Anda bagaimana menghitung probabilitas tabrakan. Untuk SHA-1, b adalah 160. Jumlah orang yang tinggal di austria di bawah 10 juta. Bahkan jika setiap orang yang hidup di austria terdaftar di rumah sakit dengan ID orang / sektor yang unik, itu hanya membuat kemungkinan tabrakan kurang dari 3.5 x 10^-35. Saya kira itu harus cukup kecil untuk tujuan paling praktis.

Doc Brown
sumber
1
Nah, apakah Anda yakin argumen itu akan berpengaruh besar pada juri ketika ini tentang hidup dan mati?
Deduplicator
1
@Deduplicator: Saya kira peluang untuk mendapatkan tabrakan karena kegagalan perangkat keras (beberapa bit membalik RAM atau penyimpanan magnetik) atau kegagalan manusia (misalnya, salah ketik) akan jauh lebih tinggi, terlepas dari ID atau hashing jenis apa digunakan. Tapi tentu saja, pettifogger mungkin melihat ini berbeda.
Doc Brown
Maksud saya adalah bahwa setiap pengacara kemungkinan besar adalah satu ... ;-)
Deduplicator
3

Hash pasti akan bertabrakan jika mereka lebih kecil dari semua kemungkinan kombinasi data.

Lihat jawaban luar biasa ini: https://softwareengineering.stackexchange.com/a/145633

Jika kunci utama tidak seharusnya bermakna (dapat dibaca manusia; mengandung sifat data yang dapat diambil), saya hanya akan pergi dengan GUID.

Ya, secara teori mereka bisa bertabrakan juga, tetapi panasnya kematian alam semesta kemungkinan terjadi terlebih dahulu. Lihat https://stackoverflow.com/a/184897


EDIT: mengatasi @ tandingan DocBrown untuk menjernihkan (dan untuk menghindari diskusi panjang dalam komentar)

Menghasilkan pengidentifikasi dari id orang atau id sektor bukan persyaratan OP (memang, ia mengakui bahwa beralih ke GUID adalah apa yang ia sarankan sendiri).

Saya tidak pernah mengklaim GUID cocok sebagai pengganti keseluruhan untuk SHA-1, atau hashing secara umum (tentu saja tidak), saya hanya mengatakan mereka dapat digunakan dalam kasus khusus ini - untuk mengidentifikasi secara unik beberapa entitas. Karena ini adalah definisi mereka.

Tidak pernah ada persyaratan bahwa pengidentifikasi ini harus dapat direkonstruksi dari data (yang merupakan keuntungan dari fungsi hash). Harap evaluasi jawaban saya dalam konteks pertanyaan aktual.

Konrad Morawski
sumber
@ Bozho Saya pikir saran Anda sama baiknya dengan yang didapat. Menggunakan pengidentifikasi 128-bit acak membuat semuanya tetap sederhana (sudah ditambah besar), dan Anda selalu dapat mengawali nilai-nilai ini dengan sesuatu yang bermakna jika Anda mau. Satu-satunya downside adalah bahwa nilai-nilai yang dihasilkan akan lama, tetapi yah, Anda tidak bisa memiliki semuanya. Saya kira mereka biasanya tidak akan terlihat oleh siapa pun - tidak digunakan karena beberapa PIN orang diharapkan untuk mengutip melalui telepon.
Konrad Morawski
2
GUID memiliki 128 bit, SHA1 menghasilkan output 160 bit. Jadi apa yang membuat Anda percaya bahwa GUID adalah pilihan yang lebih baik daripada hash SHA1 yang disebutkan OP dalam pertanyaannya?
Doc Brown
1
@DocBrown Saya diakui bukan ahli di lapangan, tetapi panjang output dengan sendirinya bukan masalah, fungsi hash masih akan mengembalikan output yang sama untuk input yang sama (itu intinya). Jika personalId + "+" + prefix + sectorIddijamin unik, maka mungkin bahkan bisa digunakan mentah, mengapa tidak, SHA1 tidak menambahkan keunikan ekstra. Masalahnya - seperti yang saya mengerti - adalah bahwa formula ini mungkin tidak menghasilkan output yang unik, terutama jika sistem diharapkan berfungsi untuk waktu yang lama (alasan pemeliharaan mungkin memerlukan mis. Menambahkan lebih banyak ID sektor - disarankan hati-hati)
Konrad Morawski
5
Saya masih belum mengerti bagaimana GUID digunakan di sini. Menggunakan GUID bukan algoritma hashing, GUID tidak dapat dihasilkan dari personID / sectorID. Ini dapat digunakan sebagai alternatif untuk yang terakhir jika generasi personID unik akan menjadi masalah sebaliknya (yang saya kira tidak), tetapi itu bukan pengganti untuk sesuatu seperti SHA-1.
Doc Brown
1
PANDUAN IMHO tidak memecahkan masalah OP. GUID sangat membantu untuk menghasilkan pengidentifikasi unik dengan cara yang terdesentralisasi - "register dasar Austria" adalah lembaga yang cukup terpusat, mereka tidak memiliki masalah itu - kode sektor personalId + sudah merupakan ID unik, mengapa membuatnya lebih rumit? Pertanyaan yang menarik adalah: mengapa mereka menerapkan hashing? Tapi itu adalah sesuatu yang saya harapkan akan disampaikan OP kepada kami.
Doc Brown
0

Menggunakan Hash atau GUID sebagai Primary Key juga merupakan ide yang buruk karena menyebabkan Indeks Fragmentasi dan sering Page Splits.

Gordon Bell
sumber