Memilih algoritma yang tepat dalam fungsi HashBytes

20

Kita perlu membuat nilai hash data nvarchar untuk tujuan perbandingan. Ada beberapa algoritma hash yang tersedia di T-SQL, tetapi yang mana yang terbaik untuk dipilih dalam skenario ini?

Kami ingin memastikan risiko memiliki nilai hash duplikat untuk dua nilai nvarchar yang berbeda adalah minimum. Berdasarkan penelitian saya di internet MD5 sepertinya yang terbaik. Apakah itu benar? MSDN memberi tahu kami (tautan di bawah) tentang algoritme yang tersedia, tetapi tidak ada deskripsi yang mana untuk kondisi apa?

HASHBYTES (Transact-SQL)

Kita perlu menggabungkan dua tabel pada dua kolom nvarchar (maks). Seperti yang dapat Anda bayangkan, kueri membutuhkan waktu untuk dijalankan. Kami pikir akan lebih baik untuk menjaga nilai hash dari setiap data nvarchar (max) dan melakukan join pada nilai hash daripada nilai nvarchar (max) yang blob. Pertanyaannya adalah algoritma hash mana yang menyediakan keunikan, sehingga kita tidak mengalami risiko memiliki satu nilai hash untuk lebih dari satu nvarchar (maks).

Langit
sumber

Jawaban:

18

The HASHBYTESFungsi hanya memakan waktu sampai 8000 byte sebagai masukan. Karena input Anda berpotensi lebih besar dari itu, duplikat dalam rentang bidang yang mendapat hash akan menyebabkan tabrakan, terlepas dari algoritma yang dipilih. Pertimbangkan dengan seksama rentang data yang Anda rencanakan untuk hash - menggunakan 4000 karakter pertama adalah pilihan yang jelas , tetapi mungkin bukan pilihan terbaik untuk data Anda.

Bagaimanapun, karena fungsi hash, bahkan jika inputnya 8000 byte atau kurang, satu - satunya cara untuk memastikan 100% kebenaran dalam hasil adalah dengan membandingkan nilai-nilai dasar di beberapa titik (baca: belum tentu pertama ). Periode.

Bisnis akan menentukan apakah akurasi 100% diperlukan atau tidak. Ini akan memberi tahu Anda bahwa (a) membandingkan nilai-nilai dasar diperlukan , atau (b) Anda harus mempertimbangkan untuk tidak membandingkan nilai-nilai dasar - seberapa banyak akurasi yang harus ditukar dengan kinerja.

Sementara tabrakan hash dimungkinkan dalam set input unik, mereka sangat jarang, terlepas dari algoritma yang dipilih. Seluruh ide menggunakan nilai hash dalam skenario ini adalah untuk secara efisien mempersempit hasil gabungan ke set yang lebih mudah dikelola, tidak harus tiba pada set hasil akhir segera. Sekali lagi, untuk akurasi 100%, ini tidak bisa menjadi langkah terakhir dalam proses. Skenario ini tidak menggunakan hashing untuk keperluan kriptografi, jadi algoritma seperti MD5 akan berfungsi dengan baik.

Akan sangat sulit bagi saya untuk membenarkan pindah ke algoritma SHA-x untuk tujuan "akurasi" karena jika bisnis akan panik tentang kemungkinan tabrakan kecil MD5, kemungkinan mereka juga akan panik bahwa algoritma SHA-x juga tidak sempurna. Mereka juga harus berdamai dengan sedikit ketidakakuratan, atau mengamanatkan bahwa kueri 100% akurat dan hidup dengan implikasi teknis yang terkait. Saya kira jika CEO tidur lebih baik di malam hari mengetahui Anda menggunakan SHA-x daripada MD5, well, baik; itu masih tidak berarti banyak dari sudut pandang teknis dalam kasus ini.

Berbicara tentang kinerja, jika tabel sebagian besar dibaca dan hasil gabung sering diperlukan, pertimbangkan menerapkan tampilan yang diindeks untuk menghilangkan kebutuhan untuk menghitung seluruh gabung setiap kali diminta. Tentu saja Anda menukar penyimpanan untuk itu, tetapi mungkin layak untuk peningkatan kinerja, terutama jika akurasi 100% diperlukan.

Untuk bacaan lebih lanjut tentang pengindeksan nilai-nilai string panjang, saya menerbitkan sebuah artikel yang membahas contoh bagaimana melakukan ini untuk satu tabel, dan menyajikan hal-hal yang perlu dipertimbangkan ketika mencoba skenario penuh dalam pertanyaan ini.

Jon Seigel
sumber
8

MD5 harus baik dan output dapat disimpan dalam biner (16). Probabilitas tabrakan (lihat paradoks ulang tahun ) masih sangat rendah, bahkan dengan ukuran sampel fisik yang besar. Output SHA-1 membutuhkan 20 byte dan output SHA-256 membutuhkan 32 byte. Kecuali jika Anda memiliki sejumlah besar catatan sehingga probabilitas tabrakan ulang tahun Anda menjadi signifikan (secara fisik tidak mungkin atau setidaknya tidak praktis dengan teknologi perangkat keras saat ini) mungkin akan baik-baik saja.

ConcernedOfTunbridgeWells
sumber
0

Saya belum melihat ini disebutkan dalam jawaban tetapi per MSDN :

Dimulai dengan SQL Server 2016 (13.x), semua algoritma selain SHA2_256, dan SHA2_512 sudah usang. Algoritme yang lebih lama (tidak disarankan) akan terus bekerja, tetapi mereka akan meningkatkan kejadian penghentian.

Saya mengajukan pertanyaan serupa sehingga terserah Anda jika Anda ingin menggunakan fungsi yang sudah tidak digunakan seperti MD5 (jika Anda menggunakan 2016+). Anda dapat melakukan pengujian untuk melihat seberapa besar perbedaan dalam penyimpanan dan kinerja antara MD5 dan SHA2.

Gabe
sumber