27.11.05

Java da hash fonksiyon yardımı ile dosya karşılaştırma

Javada iki dosyanın aynı olup olmadığını anlamak için basit bir yöntem ve kod örneği lazım oldu. Aklıma gelen ilk yol olarak hash fonksiyonu geldi. Basitçe hash fonksiyonu nedir, ne değildir önce ondan bahsedeyim. Herhangi bir boyuttaki dosya (yada başka bir veri) bir takım karmaşık matematiksel işlemler yaparak SABİT boyutlu ( örneğin 128 bit) bir veri dizisi elde edilmesi işlemine denir. Hash , tek yönlü hash (one-way hashing) olarakta geçerki bu da hashin çalışma prensibinden gelir. Tek yönlü olmasından kasıt, geri dönüşü olmamasıdır. Yani hashini bildiğiniz bir dosyayı türetemezsiniz. Aslında bu imkansız değil deneme yanılma yolu ile mümkün ama 2^128 farklı hash olduğunu düşünecek olursak çokta basit birşey değil :) Biraz olayın teknik kısmına girersek, Pratikte sonsuz sayıda dosya oluşturabileceğimizi ( farklı boyut ve sıralama ) düşünürsek hash fonksiyonu sınırlıdır (Deminde dediğimiz gibi 128 bit hash mekanizması için 2^128 farklı hash). O halde farklı iki dosyanın hashlerinin aynı olma ihtimali var ama ciddiye alınamayak kadar küçük ;)
Bu kadar laf kalabalığından sonra hash kullanarak iki dosyanın aynı olup olmadığını Java ile nasıl anlarız sorusunun cevabını verelim.
Javada bu iş için MessageDigest sınıfı mevcut, Ben kodda MD5 kullandım, diğer bilenen hash fonksiyonlarınıda destekliyor(örneğin "SHA-1").Kod oldukça basit önce bir messageDigest sınıfından bir nesne oluşturuyoruz. Daha sonra getInstance fonksiyonu ile hangi tip hash fonksiyonunu kullanacağımı belirliyoruz("MD5","SHA-1") ve hash değerini hesaplamak istediğimiz verileri messageDigest sınıfının update fonksiyonu yardımıyla
MessageDigest nesnesinin içine kopyalıyoruz.digest fonksiyonu ise bize geriye hash değerimizi döndürüyor.
Yorumlarınızı bekliyorum...


import java.security.*;
import java.io.*;

/**
*
* @author erdinc
*/
public class DosyaKarsilastir {

public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("2.jpg");
MessageDigest md = MessageDigest.getInstance("MD5");

byte []buffer= new byte[8192];
int sayac = -1;
try{
do{
sayac = fis.read(buffer);
md.update(buffer, 0, sayac);
}while(sayac != -1);
}catch(Exception File) {
System.err.println("Hata oluştu");
}

byte [] calcDigest = md.digest();

md.reset();
fis = new FileInputStream("2.jpg");

sayac = -1;
try{
do{
sayac = fis.read(buffer);
md.update(buffer, 0, sayac);
}while(sayac != -1);
}catch(Exception File) {
System.err.println("Hata oluştu");
}
byte [] calcDigest2 = md.digest();

if ( md.isEqual(calcDigest,calcDigest2)) {
System.err.println("Dosyalar aynı" );
}else {
System.err.println("Dosyalar farklı" );
}

}catch (Exception e) {
System.out.println("Hata oluştu");
}
}

}

0 comments: