Iphone 从UIImage生成哈希

Iphone 从UIImage生成哈希,iphone,cocoa-touch,hash,Iphone,Cocoa Touch,Hash,我试图比较文件系统中的两个UIImage,看看它们是否相同。显然,我不能使用NSObject的哈希方法,因为它返回的是对象的哈希,而不是实际的图像数据 我发现代码从字符串生成MD5哈希,但我还没有发现如何为UIImage实现它 我应该如何对UIImage进行哈希处理?或者,我与图像进行比较的方法完全关闭了吗?不是最佳解决方案: [ UIImagePNGRepresentation( uiImage1 ) isEqualToData: UIImagePNGRepresentation

我试图比较文件系统中的两个UIImage,看看它们是否相同。显然,我不能使用NSObject的哈希方法,因为它返回的是对象的哈希,而不是实际的图像数据

我发现代码从字符串生成MD5哈希,但我还没有发现如何为UIImage实现它


我应该如何对UIImage进行哈希处理?或者,我与图像进行比较的方法完全关闭了吗?

不是最佳解决方案:

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

这基本上比较了两幅图像的PNG编码数据。由于图像相似性是一个复杂的主题,因此可以根据最终目标设计更好、更快的解决方案(即,您希望逐像素比较图像,还是仅比较近似相似性,这可能会使用源图像的下采样版本等)

我最后使用以下代码完成了任务。请注意,这要求您导入


下面是更优雅的代码

+(NSString*)MD5HexDigest:(NSData*)输入{
无符号字符结果[CC_MD5_DIGEST_LENGTH];
CC_MD5(input.bytes,(unsigned int)input.length,result);
NSMutableString*ret=[NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
对于(int i=0;iUI图像哈希)
Swift代码,用于使用Swift 4.2中的SHA256算法对UIImage进行散列。您还可以使用其他算法,这些算法可能更快或生成的副本更少,但对于大多数用例来说,这一算法已经足够好了

只需将代码放在项目中的某个位置,然后像这样使用:
youruimage.sha256()


桥接头 顺便说一下,您需要一个桥接头来导入CommonCrypto。如果您没有桥接头,请执行以下步骤:

  • 创建新文件->头文件->另存为
    bridgengheader
  • 内置设置->目标-C桥接头->添加
    ProjectName/bridgengheader.h
  • #import
    放入头文件中

  • 重复概率 复制概率较低,但如果您拥有庞大的数据集,则可以相对轻松地升级到SHA512:

    重复概率约为:

    资料来源:


    也许是一个愚蠢的问题,但这是否需要在应用商店提交中选中“我添加了加密”复选框?我不能代表所有情况,但是,当我提交我的应用时,我没有选中该复选框。我只是使用哈希来比较两个图像,而不是任何类型的数据加密。对我来说,这会在每次传递时生成不同的哈希。使用[图像数据字节]由于CC_MD5的第一个参数似乎解决了这个问题。如果值发生变化,您应该使用
    CC_MD5_DIGEST_LENGTH
    而不是
    16
    。既然您已经使用CC_MD5_DIGEST_LENGTH作为数组长度,那么您还应该更新格式化字符串的方式以使其具有适应性。我建议使用以下代码:NSString*imageHash=@“;对于(NSInteger i=0;iunsigned 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] ];
    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
        }
    }