Hash fonksiyonlarında Wikipedia makalesi çok iyi, ama burada benim vereceğim.
Bir karma nedir?
"Hash", farklı bağlamlarda farklı biçimsel anlamlara sahip gerçekten geniş bir terimdir. Sorunuza mükemmel bir cevap yok. Genel temel kavramı açıklayacağım ve terimin en yaygın kullanımlarından bazılarından bahsedeceğim.
h
- Hesaplanması kolay olmalı ve
- Çıktılar nispeten küçük olmalıdır.
Örnek:
Diyelim ki 0 - 999,999,999 - 0 - 99 aralığındaki sayılara sahip olmak istiyoruz. Basit bir karma işlevi .h(x)=xmod100
Ortak ek özellikler:
Kullanım durumuna bağlı olarak, karma işlevinin ek özellikleri sağlamasını isteyebiliriz. İşte bazı yaygın ek özellikler:
Tekdüzelik : Genellikle, nesnelerin hashlerinin belirgin olmasını isteriz. Dahası, karmaların "yayılmasını" isteyebiliriz. Eğer bazı nesneleri 100 kovaya sokmak istersem (bu yüzden, hash fonksiyonumun çıktısı 0-99 arasında bir sayıdır), o zaman genellikle umarım yaklaşık 1/100 nesnenin 0 kovada, yaklaşık 1/100 arazide toplandığını umuyorum. kova 1, vb.
Kriptografik çarpışma direnci : Bazen bu daha uzak bir noktadan alınır, örneğin kriptografide, bir rakip için aynı çıktıya eşlenen iki farklı girdiyi bulmak için hesaplamalı olarak zor olan bir karma işlevi isteyebilirim.
Sıkıştırma : Genellikle, sabit boyutlu bir çıktıya ya da sabit sayıda kovaya keyfi büyüklükte girdiler elde etmek isterim.
Determinizm : Çıkışı çalıştırmalar arasında değişmeyen bir karma işlevi isteyebilirim, yani aynı nesnedeki karma işlevinin çıkışı her zaman aynı kalır. Bu yukarıdaki tekdüzelik ile çakışıyor gibi görünebilir, ancak bir çözüm karma işlevini rastgele bir kez seçip koşular arasında değiştirmemektir.
Bazı uygulamalar
Yaygın olarak kullanılan uygulamalardan biri, sözlükleri uygulamanın bir yolu olan karma tablo gibi veri yapılarındadır. Burada, bir miktar bellek ayırıyorsunuz, diyelim ki, 100 "kova"; daha sonra, sözlükte bir (anahtar, değer) çifti saklamanız istendiğinde, anahtarı 0-99 arasında bir sayıya getirir ve çifti, ilgili kovada bellekte saklarsınız. Ardından, bir tuşa girmeniz istendiğinde, aynı karma işlevine sahip anahtarı 0-99 arasında bir sayıya getirin ve o anahtarın içeride olup olmadığını görmek için bu kovayı kontrol edin. Öyleyse, değerini döndürürsünüz.
Sözlükleri ikili arama ağacı gibi başka nesnelerle de uygulayabileceğinizi unutmayın (nesneleriniz karşılaştırılabilirse).
Diğer bir pratik uygulama, iki dosyanın aynı olup olmadığını kontrol etmenin yolları olan sağlama toplamlarıdır (örneğin, dosya önceki sürümünden bozulmuş değildi). Karma işlevleri, iki girişi aynı çıktıya eşlemek için pek olası olmadığından, genellikle bir dize olarak gösterilen ilk dosyanın bir hastasını hesaplar ve saklarsınız. Bu karma çok küçük, belki sadece birkaç düzine ASCII karakter. Ardından, ikinci dosyayı aldığınızda, hash ve çıktının aynı olup olmadığını kontrol edin. Eğer öyleyse, neredeyse kesinlikle byte-forte için de aynı dosya.
Başka bir uygulama, bu karma değerlerin "tersine çevrilmesinin" zor olduğu kriptografidedir - yani, çıktı ve karma işlevi göz önüne alındığında, bu çıktıya yol açan girdi (ler) i hesaplamak zor hesaplamalıdır. Bunun bir kullanımı şifrelerdir: Şifreyi kendisinin saklamak yerine, şifrenin şifreli bir şifresini saklarsınız (belki bazı diğer içeriklerle birlikte). Ardından, kullanıcı bir şifre girdiğinde, karma değerini hesaplar ve doğru karma ile eşleştiğini kontrol eder; öyleyse, şifrenin doğru olduğunu söylüyorsunuz. (Şimdi, sunucuda kaydedilen hash'ı arayabilen ve bulabilen bir kişi bile, kullanıcı gibi davranarak bu kadar kolay bir zamana sahip değildir.) Bu uygulama, çıktının girdiden çok uzun veya daha uzun olduğu durumlarda olabilir. giriş çok kısa.