Генерировать hash из UIImage

Я пытаюсь сравнить два UIImages из файловой системы, чтобы убедиться, что они одинаковые. Очевидно, я не могу использовать hash-метод NSObject, поскольку он возвращает hash объекта, а не фактические данные изображения.

Я обнаружил, что код генерирует хеш MD5 из строки, но я не обнаружил, как реализовать его для UIImage.

Как я должен использовать hashирование UIImage? Или мой метод сравнения с изображениями полностью отключен?

Я выполнил следующий код для выполнения задачи. Обратите внимание, что для этого требуется импортировать :

 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] ]; 

Менее оптимальное решение:

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

Это в основном сравнивает PNG-кодированные данные двух изображений. Поскольку подобие изображения является сложным предметом, более эффективные и быстрые решения могут быть разработаны на основе того, что именно является конечной целью (т. Е. Вы хотите сравнить изображения, пиксель за пикселем или просто приблизительное сходство, которое могло бы использовать версию с пониженной дискретизацией источника изображение и т. д.).

более элегантный код ниже

 +(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

Swift Code для hashирования UIImage с алгоритмом SHA256 в быстром 4.2. Существуют и другие алгоритмы, которые вы можете использовать, которые могут ускоряться или генерировать меньше дубликатов, но этот уровень достаточно хорош для большинства случаев использования.

Просто yourUIImage.sha256() код в своем проекте и используйте его следующим образом: 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, который импортирует CommonCrypto. Если у вас нет одного, выполните следующие действия:

  1. Создать новый файл -> Файл заголовка -> Сохранить как BridgingHeader
  2. В настройках сборки -> Objective-C Bridging Header -> add ProjectName/BridgingHeader.h
  3. Поместите #import в файл заголовка

Дублируемая вероятность

Дублированная вероятность низкая, но вы можете легко обновиться до SHA512, если у вас есть огромные наборы данных:

Дублирующая вероятность:

введите описание изображения здесь

Источник: https://crypto.stackexchange.com/questions/24732/probability-of-sha256-collisions-for-certain-amount-of-hashed-values

Interesting Posts

Как лучше написать движок воксела в C с учетом производительности

свойство системы настройки

Что означает атрибут Enlue Enum в C #?

Как исправить ошибку загрузчика Windows XP, когда BOOTCFG, FIXBOOT и FIXMBR ничего не делают?

У меня есть защищенный паролем USB-накопитель со скрытым разделом, как конвертировать в обычный USB-накопитель?

Как настроить удаленный домашний каталог на Mac OS X?

Добавить ON DELETE поведение CASCADE в таблицу sqlite3 после ее создания

Spring RestTemplate – как включить полную отладку / протоколирование запросов / ответов?

Как игнорировать маршрут в asp.net

Как показать скрытые папки в Windows 8 из современного пользовательского интерфейса?

Word переносит строку в несколько строк

Как отключить спящий режим в Windows 7

Слушайте изменения в DIV и действуйте соответственно

Почему темы не рекомендуются в .NET Reactive Extensions?

Как сделать ui отзывчивым все время и делать обновление фона?

Давайте будем гением компьютера.