【问题标题】:Check if same image has already been uploaded by comparing BASE64?通过比较BASE64检查是否已经上传了相同的图像?
【发布时间】:2015-07-18 09:46:05
【问题描述】:
我的问题是关于我的一个想法,我可以通过比较它们的 base64 编码字符串来检查图像是否已经上传...
示例用例是在数据库中查找重复项...
我猜这个操作会非常大 - 首先将图像转换为 base64,然后使用“strcmp()”之类的东西进行比较..
不确定这是否有意义,但您如何看待这个想法?
手术会不会太大?它有多准确?这个想法有意义吗?
【问题讨论】:
标签:
php
base64
string-comparison
【解决方案1】:
这是一个可以帮助您更快地比较文件的功能。
除了检查文件大小等显而易见的事情之外,您还可以通过比较二进制块来进行更多操作。
例如,检查最后 n 个字节以及随机偏移量。
我使用校验和比较作为最后的手段。
在优化检查顺序时,您还可以考虑您是否通常期望文件不同。
function areEqual($firstPath, $secondPath, $chunkSize = 500){
// First check if file are not the same size as the fastest method
if(filesize($firstPath) !== filesize($secondPath)){
return false;
}
// Compare the first ${chunkSize} bytes
// This is fast and binary files will most likely be different
$fp1 = fopen($firstPath, 'r');
$fp2 = fopen($secondPath, 'r');
$chunksAreEqual = fread($fp1, $chunkSize) == fread($fp2, $chunkSize);
fclose($fp1);
fclose($fp2);
if(!$chunksAreEqual){
return false;
}
// Compare hashes
// SHA1 calculates a bit faster than MD5
$firstChecksum = sha1_file($firstPath);
$secondChecksum = sha1_file($secondPath);
if($firstChecksum != $secondChecksum){
return false;
}
return true;
}
【解决方案2】:
如果我要做这样的事情,我会使用 md5 哈希而不是 base64_encode。
$equal = ( md5($image1) == md5($image2)) ? true : false;
【讨论】:
-
-
-
几兆字节的编码图像将是比较大的字符串。 md5_file 会更快。如果它存储在数据库中,它会稍微复杂一些,但我认为它仍然会更快。我还没有检查过,所以最好的解决方案是两个都试一下,看看哪个表现更好。
-