यहाँ एक powershell स्क्रिप्ट LockBits का उपयोग कर निकाले के रूप में छवि का केवल बाइट्स पर एक SHA256 हैश पैदा करता है: यह एक पाइप लाइन के सक्षम संस्करण भी वाइल्डकार्ड और शाब्दिक रास्तों को स्वीकार करता है। यह अलग-अलग फाइलों के लिए एक अद्वितीय हैश उत्पन्न करना चाहिए जो अलग है। कृपया ध्यान दें, कि मैंने फ़ाइल पुनरावृत्त कोड शामिल नहीं किया है, हालांकि वर्तमान में हार्डकोड c: \ test.bmp को फ़ोरैच निर्देशिका इटरेटर के साथ प्रतिस्थापित करने के लिए यह अपेक्षाकृत सरल कार्य होना चाहिए। परिवर्तनीय $ फ़ाइनल में अंतिम हैश की हेक्स-एसीआई स्ट्रिंग शामिल है।
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing.Imaging")
[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
$bmp = [System.Drawing.Bitmap]::FromFile("c:\\test.bmp")
$rect = [System.Drawing.Rectangle]::FromLTRB(0, 0, $bmp.width, $bmp.height)
$lockmode = [System.Drawing.Imaging.ImageLockMode]::ReadOnly
$bmpData = $bmp.LockBits($rect, $lockmode, $bmp.PixelFormat);
$dataPointer = $bmpData.Scan0;
$totalBytes = $bmpData.Stride * $bmp.Height;
$values = New-Object byte[] $totalBytes
[System.Runtime.InteropServices.Marshal]::Copy($dataPointer, $values, 0, $totalBytes);
$bmp.UnlockBits($bmpData);
$sha = new-object System.Security.Cryptography.SHA256Managed
$hash = $sha.ComputeHash($values);
$final = [System.BitConverter]::ToString($hash).Replace("-", "");
शायद बराबर सी # कोड भी समझ में आप सहायता करेगा:
private static String ImageDataHash(FileInfo imgFile)
{
using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imgFile.FullName))
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr dataPointer = bmpData.Scan0;
int totalBytes = bmpData.Stride * bmp.Height;
byte[] values = new byte[totalBytes];
System.Runtime.InteropServices.Marshal.Copy(dataPointer, values, 0, totalBytes);
bmp.UnlockBits(bmpData);
SHA256 sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(values);
return BitConverter.ToString(hash).Replace("-", "");
}
}
स्रोत
2010-01-18 19:55:17
आपका पहला दृष्टिकोण काम नहीं करता है । यह एक ही छवि (विभिन्न मेटाडाटा) के लिए अलग हैशकोड देता है। दूसरा दृष्टिकोण काम करता है और PowerShell स्क्रिप्ट में पूर्णता के विभिन्न स्तरों पर हर कोई क्या कर रहा है। :-) –