Generar hash de UIImage

Estoy tratando de comparar dos UIImages del sistema de archivos para ver si son los mismos. Obviamente, no puedo usar el método hash de NSObject, ya que esto devuelve un hash del objeto, y no los datos de imagen reales.

Encontré el código generar un hash MD5 a partir de una cadena, pero no he descubierto cómo implementarlo para un UIImage.

¿Cómo debo hacer hashing con un UIImage? ¿O mi método para comparar imágenes está totalmente desconectado?

Terminé usando el siguiente código para realizar la tarea. Tenga en cuenta que esto requiere que importe :

 unsigned char result[CC_MD5_DIGEST_LENGTH]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(inImage)]; CC_MD5([imageData bytes], [imageData length], result); NSString *imageHash = [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; 

Una solución menos que óptima:

 [ UIImagePNGRepresentation( uiImage1 ) isEqualToData: UIImagePNGRepresentation( uiImage2 ) ]; 

Esto básicamente compara los datos codificados en PNG de las 2 imágenes. Dado que la similitud de la imagen es un tema complejo, se pueden idear soluciones mejores y más rápidas basándose exactamente en el objective final (es decir, si está buscando comparar imágenes, píxel por píxel o similitud aproximada, que podría usar una versión reducida de la fuente imagen, etc.).

código más elegante a continuación

 +(NSString *)MD5HexDigest:(NSData *)input { unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(input.bytes, (unsigned int)input.length, result); NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; for (int i = 0; i 

UIImage Hashing

Código Swift para hash de un UIImage con el algoritmo SHA256 en veloz 4.2. Hay otros algoritmos que puede usar, que pueden ser más rápidos o generar menos duplicados, pero este es lo suficientemente bueno para la mayoría de los usos.

Simplemente coloque el código en algún lugar de su Proyecto y utilícelo de esta manera: yourUIImage.sha256()

 extension UIImage{ public func sha256() -> String{ if let imageData = cgImage?.dataProvider?.data as? Data { return hexStringFromData(input: digest(input: imageData as NSData)) } return "" } private func digest(input : NSData) -> NSData { let digestLength = Int(CC_SHA256_DIGEST_LENGTH) var hash = [UInt8](repeating: 0, count: digestLength) CC_SHA256(input.bytes, UInt32(input.length), &hash) return NSData(bytes: hash, length: digestLength) } private func hexStringFromData(input: NSData) -> String { var bytes = [UInt8](repeating: 0, count: input.length) input.getBytes(&bytes, length: input.length) var hexString = "" for byte in bytes { hexString += String(format:"%02x", UInt8(byte)) } return hexString } } 

Bridging Header

Por cierto, necesita un encabezado de puente que importe CommonCrypto. Si no tiene uno, siga estos pasos:

  1. Crear nuevo archivo -> Archivo de encabezado -> Guardar como BridgingHeader
  2. En Configuración de comstackción -> Encabezado de puente de Objective-C -> agregar ProjectName/BridgingHeader.h
  3. Coloque #import en su archivo de encabezado

Probabilidad duplicada

La probabilidad duplicada es baja, pero puedes actualizar a SHA512 de manera relativamente fácil si tienes grandes conjuntos de datos:

La probabilidad duplicada se trata de:

enter image description here

Fuente: https://crypto.stackexchange.com/questions/24732/probability-of-sha256-collisions-for-certain-amount-of-hashed-values