通过比较BASE64编码来检查是否已上传相同的图像?

4

我的问题涉及到一个想法,我可以通过比较图片的base64编码字符串来检查它是否已经上传...

例如,用于在数据库中查找重复项...

这个操作可能会很大 - 首先将图像转换为base64,然后使用类似于“strcmp()”的方法进行比较...

不确定这是否有太多意义,但你认为这个想法如何?

这个操作会不会太大了?它的准确度如何?这个想法是否有意义?


哈希更小,这就是它的作用:http://php.net/md5_file - AbraCadaver
@AbraCadaver 好的,谢谢!;) - der-lukas
2个回答

2
这里有一个函数可以帮助你更快地比较文件。
除了检查文件大小等显而易见的事情之外,你还可以通过比较二进制块来进行更多的操作。例如,检查最后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;
}

我喜欢这个想法!:) 感谢您提供的函数! - der-lukas

1
如果我要做类似的事情,我会使用md5哈希而不是base64编码。
$equal = ( md5($image1) == md5($image2)) ? true : false;

嗯,你能解释一下为什么吗? - der-lukas
可能是 md5_file() - AbraCadaver
几兆字节编码图像将是相当大的字符串进行比较。md5_file会更快。如果它存储在数据库中,这会有点复杂,但我认为它仍然会更快。我还没有检查过,所以最好的解决方案是尝试两种方法并查看哪种执行效果更好。 - gotha
这对比较字节数组(而不是base64字符串)非常有效。 - Nickson Yap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接