Je veux calculer un hachage SHA1 de différents bitmaps (SHA n'est pas forcé). Le problème est qu'il y a des bitmaps (captchas) qui sont fondamentalement identiques, mais le nom change souvent. P>
J'ai trouvé ceci: p>
5 Réponses :
dans Android 3.1 ou version ultérieure (niveau d'API 12) Il existe une méthode sur Si vous devez cibler un niveau d'API inférieur, vous devez écrire une méthode qui itière sur chaque pixel des deux objets et voir s'ils correspondent. Ce sera un processus très intensif si cela est fait en code Java, vous pouvez donc envisager d'écrire une petite routine à l'aide de la NDK que vous pouvez appeler de votre application pour effectuer la comparaison dans le code natif (il y a des API bitmap dans le NDK afin que vous puissiez facilement Obtenez sur les tampons de pixels). P>
Si vous choisissez de le faire en Java, htth p> bitmap code> appelé
samas () code> qui comparera les pixels et le retour si les deux représentent la même chose image. Cela le fait dans le code natif, il est donc relativement rapide. P>
getpixels () code> vous aidera à obtenir des tableaux des données pixels que vous pouvez comparer entre les deux images. P>
Vous pouvez essayer d'écrire votre propre fonction en utilisant uniquement le pixel à partir du bitmap:
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; }
Voici un moyen plus natif pour calculer le hasch bitmap, en utilisant arrayes.hashcode code> et
bitmap.getpixels code>
La solution la plus rapide que j'ai trouvée jusqu'à présent dans Kotlin: presque 100 fois plus rapidement que la réponse acceptée p> p> p>
toujours retourne 1
problème similaire et cela a fonctionné pour moi (problème résolu avec un nouveau nom pour un bitmap spécifique, je pourrais donc vérifier s'il était déjà stocké):
fun getUniqueBitmapFileName(bitmap: Bitmap): String { val buffer = ByteBuffer.allocate(bitmap.getByteCount()) bitmap.copyPixelsToBuffer(buffer) return Arrays.hashCode(buffer.array()).toString() }
Votre question est très confuse: vous attendez-vous à deux bitmaps avec la même "image à l'intérieur" et des noms différents pour résulter du même hachage? Pourquoi ce que vous avez déjà trouvé n'est pas la bonne solution pour vous? Oui bitmaps.hashscode () renvoie un entier, qu'est-ce qui ne va pas avec elle (si Sha n'est pas forcé)? Veuillez reformuler votre question si vous voulez avoir une réponse significative
Je recèle différents bitmaps (CAPTCHAS) de l'analyse d'un site Web, souvent les mêmes images avec des noms différents. Peut-être que j'ai mal compris bitmap.hashcode (), il génère un hash pour l'objet, et non pour la teneur en bitmap? // question modifiée