2012-06-20 113 views
4

我想計算不同位圖的SHA1散列(SHA不是強制)。 問題是,有一些位圖(驗證碼)基本相同,但名稱經常更改。Android計算位圖散列

我發現這一點:

Compute SHA256 Hash in Android/Java and C#

但它不是我想要的soloution。

的Bitmap.hashCode(),生成僅一個整數,並且當IM右

返回一個整數哈希代碼此對象。通過契約,equals(Object)返回true的任何兩個對象都必須返回相同的哈希碼值。這意味着Object的子類通常覆蓋兩種方法或兩種方法。

我不想要對象的哈希碼,我想位圖內容的哈希碼。 Thanx!

+0

您的問題很混亂:您是否期望兩個Bitmaps具有相同的'Picture inside'和不同的名稱以產生相同的散列?爲什麼你已經發現了不適合你的正確解決方案?是Bitmaps.hashCode()返回一個整數,它有什麼問題(如果SHA沒有被強制)?如果你想得到一個有意義的答案,請更改你的問題 –

+0

我通過解析一個網站,通常是不同的名稱相同的圖片,我recru不同的位圖(驗證碼)。 可能是我missunderstood Bitmap.hashCode(),它生成一個對象的散列,而不是位圖內容? //編輯問題 – MemLeak

回答

1

你可以嘗試使用只對像素從位圖編寫自己的功能:

public long hashBitmap(Bitmap bmp){ 
    long hash = 31 //or a higher prime at your choice 
    for(int x = 0; x < bmp.getWidth(); x++){ 
    for (int y = 0; y < bmp.getHeight(); y++){ 
     hash *= (bmp.getPixel(x,y) + 31); 
    } 
    } 
    return hash; 
} 

如果只有比較兩個圖像,你可以優化這個程序哈希只是每秒或x像素

4

在Android 3.1或更高版本(API級別12)中,有一種方法Bitmap,名爲sameAs(),它將比較像素並在兩者代表相同圖像時返回。它在本地代碼中執行此操作,因此速度相對較快。

如果您必須定位一個較低的API級別,則必須編寫一個方法來迭代兩個對象的每個像素並查看它們是否匹配。如果在Java代碼中完成,這將是一個非常密集的過程,因此您可以考慮使用NDK編寫一個小例程,您可以從應用程序調用該NDK以本機代碼進行比較(NDK中有位圖API,因此您可以輕鬆得到像素緩衝區)。

如果您選擇在Java中這樣做,getPixels()將幫助您獲取可以在兩個圖像之間進行比較的像素數據陣列。

HTH