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?
personalId
+sectorID
akan 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?Jawaban:
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.sumber
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.
sumber
personalId + "+" + prefix + sectorId
dijamin 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)Menggunakan Hash atau GUID sebagai Primary Key juga merupakan ide yang buruk karena menyebabkan Indeks Fragmentasi dan sering Page Splits.
sumber