Android计算位图的哈希值

Mem*_*eak 4 hash android bitmap

我想计算不同位图的SHA1哈希值(不强制使用SHA).问题是有一些基本相同的位图(验证码),但名称经常变化.

我发现了这个:

在Android/Java和C#中计算SHA256哈希

但这不是我想要的解决方案.

Bitmap.hashCode()只生成一个Integer,当我正确时

返回此对象的整数哈希代码.通过契约,equals(Object)返回true的任何两个对象都必须返回相同的哈希码值.这意味着Object的子类通常会覆盖两个方法或两个方法.

我不想要对象的哈希码,我想要位图内容的哈希码.感谢名单!

Dev*_*red 7

在Android 3.1或更高版本(API级别12)中,有一个Bitmap被调用的方法sameAs(),它将比较像素并返回两个代表相同图像的方法.它在本机代码中执行此操作,因此它相对较快.

如果必须以较低的API级别为目标,则必须编写一个迭代两个对象的每个像素的方法,并查看它们是否匹配.如果在Java代码中完成,这将是一个非常密集的过程,因此您可以考虑使用可以从应用程序调用的NDK编写一个小例程,以便在本机代码中进行比较(NDK中有Bitmap API,因此您可以轻松实现得到像素缓冲区).

如果您选择在Java中执行此操作,getPixels()将帮助您获取可在两个图像之间进行比较的像素数据阵列.

HTH


Raf*_*l T 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;
}
Run Code Online (Sandbox Code Playgroud)

如果它只是比较两个图像,您可以优化此例程以仅每秒或 x 像素进行哈希处理