سلام
امروز زد به سرم که یه برنامه بنویسم که با استفاده از اون بشه از تغییر کردن فایها خبردار شد. خوب برنامه راحتی است، باید یک کپی از هر فایل بگیریم و هر بار که برنامه اجرا شد همه آن فایلها را بیت به بیت با هم مقایسه کند!
فکر کنم این روش برای دایرکتوری ویندوز من حدود 10 هزار سالی طول بکشه (1.74 گیگا بایت و 13438 فایل)
پس باید روش دیگری باشد. با توجه با اینکه این روزها من علاقه شدیدی به Hash پیدا کردهام و همه چیز را Hash شده میبینم! برای این کار هم از Hash استفاده کردم. از آنجایی که Hash برای هر رشته با طول متغیر یک رشته با طول ثابت برمیگرداند و این رشته(Hash) منحصر به فرد است. میتوان Hash فایلها را نگهداری کرد و وقتی خواستیم ببینیم چه فایلهای تغییر کرده اند کافی است که یک بار دیگر Hash آنها را حساب کنیم و با Hash قبلی مقایسه کنیم.
البته خیلیها معتقدند که هیچ تابع Hash ای نمیتواند تضمین کند که در ازای هر دو رشته متفاوتی دو hash متفاوت بدهد. (با توجه به متغیر بودن طول رشته ورودی و ثابت بودن طول رشته خروجی نباید هم امکانپذیر باشد) ولی به هر حال تابع Hash الگریتم MD5 خیلی خوب کار میکند بطوری که وقتی من یک فایل BMP که حجم آن حدود 3 مگابایت(1152x864) بود را Hash کردم و پس از آن یک پیکسل سفید آن را سیاد کردم عبارت Hash تغییر کرد.
هرچند هنوز هم این برنامه خیلی کند است! (یک جستجو و یک بروزرسانی در بانک ، و یک تبدیل به هش(خواند کل فایل) به ازای هر فایل) ولی حداقل چندهزار سال طول نمیکشد!
بخش مهم این برنامه یک کلاس به اسم JootiMD5 است (خودخواه! خودبین! خوپسند! خودپرست! هرچی دلتون میخواد بگین!) که از کلاس MD5CryptoServiceProvider ارث برده است.
توابع :
Compare : مقایسه کردن یک آرگمان ساده اول با آرگمان دوم که Hash است.(6 تابع بار اضافی داده شده)
CompareHexHash : مقایسه کردن یک آرگمان ساده اول با آرگمان دوم که Hash است ولی در آن بجای 256 کاراکتر اسکی فقط از کاراکترهای هگزا استفاده شده(اینجوری ذخیره سازی و انتفالش راحت تره) (2 تابع بار اضافی داده شده)
ComputeHexHash : آرگمان ورودی را به Hash از نوع با کاراکتر Hex تبدیل میکند. (3 تابع بار اضافی داده شده)
ComputeHash : دو جریان داده (مثلا filestram) میگیرد و Hash اولی را در دومی ذخیره میکند.
IsEqual : دو جریان داده (مثلا دو فایل) میگیرد و میگوید که این دو با هم برابر هستند یا نه.
حالا این برنامه به چه درد میخوره؟ میشه باهاش فهمید یه برنامه جدید که اینستال شده چه فایلهایی رو تغییر داده یا ایجاد کرده، اگه یه ویروسی لطف کنه و فایلهای exe را تغییر بدهد با این فایل میشه فهمید که اون فایلها تغییر کرده اند و....
چند کاربرد دیگر برای جالب برای Hash :
برای پیدا کردن فایلهای یکسان که اسم آنها با هم فرق دارد.
پیدا کردن Mirror برای فایلی که قصد دانلود کردن آن را داریم.
(در ذخیر بازیابی) پیدا کردن رکورد مورد نظر با پیچیدگی زمانی 1 .
و ...
Download (به همراه فایل exe)
جوتی
حاشیه : اگه رابط کاربرش خیلی چرته خودتون درستش کنین!
حاشیه 2 : برنامه با VB.Net نوشته شده.
حاشیه 3 : از بخشهایی از
این کد هم استفاده شده.
حاشیه 4 : این الگریتم MD5 عجب شاهکاریه!
حاشیه 5 : قراره بعدا فایلهای پاک شده را هم تشخیص بدهد و ...