huihuangjiuai / imagehash
PHP的感知图像哈希
Requires
- php: ^8.0
- intervention/image: ^2.4
- phpseclib/phpseclib: ^3.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^7|^8|^9
Suggests
- ext-gd: GD or ImageMagick is required
- ext-gmp: GMP results in faster comparisons
- ext-imagick: GD or ImageMagick is required
This package is auto-updated.
Last update: 2024-09-29 06:15:00 UTC
README
感知哈希是由多媒体文件内容的各种特征派生出的多媒体文件的指纹。与依赖于输入小变化导致输出剧烈变化的雪崩效应的加密哈希函数不同,如果特征相似,感知哈希之间“非常接近”。
与MD5和SHA1等加密哈希函数相比,感知哈希是一个不同的概念。在加密哈希中,哈希值是随机的。用于生成哈希的数据像一个随机种子,因此相同的数据将生成相同的结果,但不同的数据将生成不同的结果。比较两个SHA1哈希值实际上只能告诉你两件事。如果哈希值不同,则数据不同。如果哈希值相同,则数据很可能是相同的。相比之下,感知哈希可以进行比较——给你两个数据集之间的相似性感觉。
此代码受以下内容启发/基于以下内容
- https://github.com/kennethrapp/phasher
- http://www.phash.org
- http://blockhash.io
- http://www.hackerfactor.com/blog/?/archives/529-Kind-of-Like-That.html
- http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html
- http://blog.iconfinder.com/detecting-duplicate-images-using-python
要求
- PHP 7.1或更高版本
- gd或imagick扩展https://php.ac.cn/manual/en/book.image.php 或 https://php.ac.cn/manual/en/book.imagick.php
- 可选,安装GMP扩展以加快指纹比较速度https://php.ac.cn/manual/en/book.gmp.php
安装
此包尚未达到稳定版本,0.x版本之间可能存在向后兼容性问题。如果您打算在生产中使用此包,请确保锁定版本!
使用Composer安装
composer require jenssegers/imagehash
用法
该库包含4种内置哈希实现
Jenssegers\ImageHash\Implementations\AverageHash- 基于平均图像颜色的哈希Jenssegers\ImageHash\Implementations\DifferenceHash- 基于前一个像素的哈希Jenssegers\ImageHash\Implementations\BlockHash- 基于blockhash.io的哈希 仍在开发中Jenssegers\ImageHash\Implementations\PerceptualHash- 原始pHash 仍在开发中
选择这些实现之一。如果您不知道要使用哪个,请尝试DifferenceHash实现。某些实现允许一些配置,请务必检查构造函数。
use Jenssegers\ImageHash\ImageHash; use Jenssegers\ImageHash\Implementations\DifferenceHash; $hasher = new ImageHash(new DifferenceHash()); $hash = $hasher->hash('path/to/image.jpg'); echo $hash; // or echo $hash->toHex();
生成的Hash对象是一个十六进制图像指纹,一旦计算即可存储在数据库中。使用汉明距离比较两个图像指纹的相似性。低距离值表示图像相似或相同,高距离值表示图像不同。使用以下方法检测图像是否相似
$distance = $hasher->distance($hash1, $hash2); // or $distance = $hash1->distance($hash2);
相同的图像不总是具有0的距离值,因此您需要确定在哪个距离上评估图像是否相同。对于我测试的图像集,最大距离为5是可以接受的。但这将取决于实现、图像和图像数量。例如;当比较少量图像时,应接受较低的极限距离,因为假阳性的可能性很低。然而,如果您正在比较大量图像,5可能已经太多了。
Hash对象可以以几种不同的格式返回内部二进制哈希
echo $hash->toHex(); // 7878787c7c707c3c echo $hash->toBits(); // 0111100001111000011110000111110001111100011100000111110000111100 echo $hash->toInt(); // 8680820757815655484 echo $hash->toBytes(); // "\x0F\x07ƒƒ\x03\x0F\x07\x00"
选择您存储哈希值到数据库的偏好。如果您想从先前计算出的值中重建Hash对象,请使用
$hash = Hash::fromHex('7878787c7c707c3c'); $hash = Hash::fromBin('0111100001111000011110000111110001111100011100000111110000111100'); $hash = Hash::fromInt('8680820757815655484');
演示
这些图像是相似的
Image 1 hash: 3c3e0e1a3a1e1e1e (0011110000111110000011100001101000111010000111100001111000011110)
Image 2 hash: 3c3e0e3e3e1e1e1e (0011110000111110000011100011111000111110000111100001111000011110)
Hamming distance: 3
这些图像是不同的
Image 1 hash: 69684858535b7575 (0010100010101000101010001010100010101011001010110101011100110111)
Image 2 hash: e1e1e2a7bbaf6faf (0111000011110000111100101101001101011011011101010011010101001111)
Hamming distance: 32
安全联系方式
要报告安全漏洞,请遵循以下步骤。



