HashBytes işlevinde doğru algoritmayı seçme


20

Karşılaştırma amacıyla nvarchar verilerinin karma değerini oluşturmamız gerekir. T-SQL'de birden fazla karma algoritma vardır, ancak bu senaryoda hangisinin en iyisi seçilebilir?

İki farklı nvarchar değeri için yinelenen karma değerine sahip olma riskinin minimum olmasını sağlamak istiyoruz. İnternette yaptığım araştırmaya dayanarak MD5 en iyisi gibi görünüyor. Bu doğru mu? MSDN bize (aşağıdaki bağlantı) mevcut algoritmalar hakkında bilgi verir, ancak hangi koşullar için hangisinin açıklandığı konusunda bir açıklama yok?

HASHBYTES (Transact-sql)

İki nvarchar (max) sütununda iki tabloyu birleştirmemiz gerekiyor. Tahmin edebileceğiniz gibi, sorgunun yürütülmesi zaman alır. Her nvarchar (max) verinin karma değerini korumanın ve blob olan nvarchar (max) değerlerinden ziyade karma değerlerinde birleştirme yapmanın daha iyi olacağını düşündük. Soru, hangi karma algoritmanın benzersiz olduğunu sağlamasıdır, böylece birden fazla nvarchar (max) için bir karma değerine sahip olma riskine girmiyoruz.

Yanıtlar:


18

HASHBYTESİşlevi yalnızca girdi olarak 8000 byte kadar sürer. Senin girişler bundan daha potansiyel olarak geniş olduğu için karma alır alanın aralığında yineler olacak bakılmaksızın seçilen algoritma, çarpışmalara neden olur. Karıştırmayı planladığınız veri aralığını dikkatlice düşünün - ilk 4000 karakteri kullanmak bariz bir seçimdir, ancak verileriniz için en iyi seçim olmayabilir .

Her halükarda, karma işlevinin ne olması nedeniyle, girişler 8000 bayt veya daha az olsa bile , sonuçlarda% 100 doğruluk sağlamanın tek yolu temel değerleri bir noktada karşılaştırmaktır (okuma: ilki olmak zorunda değildir ). Dönemi.

İşletme,% 100 doğruluk gerekip gerekmediğini belirleyecektir. Bu baz değerleri karşılaştırarak ya (a) olduğunu söyleyecektir gerekli , veya (b) Eğer gerektiğini düşünün değil taban değerlerinin karşılaştırılması - performans için kapalı takas gerektiğini ne kadar doğruluk.

Eşsiz bir girdi setinde karma çarpışmalar mümkün olsa da, seçilen algoritmaya bakılmaksızın sonsuz derecede nadirdir. Bu senaryoda bir karma değer kullanma fikri, birleştirme sonuçlarını etkili bir şekilde daha yönetilebilir bir kümeye daraltmaktır, nihai sonuç kümesine hemen ulaşmak zorunda değildir. Yine,% 100 doğruluk için, bu sürecin son adımı olamaz . Bu senaryo, karma işlemini kriptografi amacıyla kullanmaz, bu nedenle MD5 gibi bir algoritma iyi çalışır.

"Doğruluk" amaçları için bir SHA-x algoritmasına geçmeyi haklı çıkarmak benim için çok zor olurdu, çünkü eğer işletme MD5'in küçük çarpışma olasılıkları hakkında korkacaksa, onlar da korkacaklar SHA-x algoritmaları da mükemmel değil. Ya küçük bir yanlışlıkla karşılaşmak zorundalar ya da sorgunun% 100 doğru olmasını ve ilgili teknik çıkarımlarla yaşamalarını şart koşarlar. CEO, MD5 yerine SHA-x kullandığınızı bilerek geceleri daha iyi uyuyorsa, iyi, iyi; bu durumda teknik açıdan hala pek bir anlam ifade etmiyor.

Performanstan bahsetmek gerekirse, tablolar çoğunlukla okunuyorsa ve birleştirme sonucuna sık sık ihtiyaç duyuluyorsa, her istendiğinde birleştirmenin tamamını hesaplama ihtiyacını ortadan kaldırmak için dizine alınmış bir görünüm uygulamayı düşünün. Tabii ki bunun için depolama alanı dışında işlem yaparsınız, ancak özellikle% 100 doğruluk gerekiyorsa, performans iyileştirmesi için buna değer olabilir.

Uzun dize değerlerini endeksleme hakkında daha fazla okumak için, bunu tek bir tablo için nasıl yapacağınıza dair bir örnek üzerinde yürüyen bir makale yayınladım ve bu sorudaki tüm senaryoyu denerken dikkate alınması gereken şeyler sunuyor.


8

MD5 iyi olmalı ve çıktı bir ikili dosyada (16) saklanabilir. Çarpışma olasılığı ( doğum günü paradoksuna bakın ), büyük bir fiziksel örneklem büyüklüğü ile bile hala çok düşüktür. SHA-1 çıkışı 20 bayt alır ve SHA-256 çıkışı 32 bayt alır. Çok fazla kayıtınız olmadığı sürece, doğum günü çarpışma olasılığınız önemli hale gelir (fiziksel olarak imkansız veya en azından mevcut donanım teknolojileriyle pratik değildir) muhtemelen iyi olacaktır.



0

Bu cevaplarda belirtilen görmedim ama MSDN başına :

SQL Server 2016 (13.x) ile başlayarak, SHA2_256 ve SHA2_512 dışındaki tüm algoritmalar kullanımdan kaldırılmıştır. Eski algoritmalar (önerilmez) çalışmaya devam eder, ancak kullanımdan kaldırma olayını yükseltirler.

Benzer bir soru sordum, bu yüzden MD5 gibi kullanımdan kaldırılmış bir işlevi kullanmak istiyorsanız (2016+ kullanıyorsanız) size kalmış. MD5 ve SHA2 arasında depolama ve performansta ne kadar fark olduğunu görmek için test yapabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.