我有时听到这个术语,想知道它是用于什么?
哈希是一种应用于任意数据并生成固定大小数据(通常非常小)的函数。有许多不同类型的哈希,但如果我们谈论图像哈希,则主要用于:
对于我们看来完全相同的图像,如果只比较原始的字节,它们可能会非常不同。这可能是由于以下原因:
即使您找到的图像只在一个字节上不同,如果对其应用哈希函数,则结果可能会非常不同(对于像MD5、SHA这样的哈希来说,它很可能完全不同)。
因此,您需要一种哈希函数,它将为相似的图像创建相似的(甚至是相同的)哈希。其中一种通用算法是局部敏感哈希。但是,我们知道图像可能存在哪些问题,因此我们可以想出一种更专业的哈希。
最著名的算法包括:
顺便说一句,如果您使用Python,所有这些哈希已经在这个库中实现了。
通常情况下,对文件进行哈希会对文件的每个数据位进行哈希,而图像哈希则在稍微高一级的层面上工作。区别在于,对于图像哈希而言,如果两张图片看起来几乎相同但格式、分辨率不同(或者存在轻微损坏,可能是由于压缩引起),它们应该哈希到同一个数字。尽管它们实际的数据位完全不同,如果它们对人类来说几乎相同,那么它们哈希得到相同的结果。
这种技术有一个应用就是搜索。TinEye.com允许你上传一张图片,并在互联网上查找其许多出现的位置。与谷歌一样,它有一个网络爬虫,遍历网页并寻找图片。然后对这些图片进行哈希并将哈希和URL存储在数据库中。当你上传一张图片时,它只需计算哈希并检索数据库中链接到该哈希的所有URL。TinEye的示例用途包括查找更高分辨率版本的图片,或者通过照片找到某人的公开Facebook / Myspace /等社交媒体个人资料(假设这些资料使用了相同的照片)。
图像哈希还可以与缓存或本地存储一起使用,以防止重复传输或存储重复照片。
还有许多其他可能性,包括图像认证和查找视频中类似的帧(正如其他人所提到的)。
哈希在一般情况下是一种有用的方式,可以将大量数据缩减为一个相对短的数字,以用于标识该图像。
有时候它们只是提供了一种方便的方式来标识文件,而不需要人工干预,特别是在存在多个并行作者的情况下,不能依靠他们逐个增加某个主计数器(JPG001 JPG002)而不重叠。
有时候哈希也被用作不可伪造的方式,这样我就可以说 - 如果您生成的图像哈希与我发送给您时所做的哈希相同,那么您可以确定它是我的(而不是被恶意调整过)。然而,并非所有哈希都能做到这一点,每隔几年就会发现一种流行的“加密”哈希具有致命缺陷。
嗯...如何快速比较图像(广义上的图片或任何其他二进制文件),而不必比较整个文件?