【问题标题】:Check if same image has already been uploaded by comparing BASE64?通过比较BASE64检查是否已经上传了相同的图像?
【发布时间】:2015-07-18 09:46:05
【问题描述】:

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

示例用例是在数据库中查找重复项...

我猜这个操作会非常大 - 首先将图像转换为 base64,然后使用“strcmp()”之类的东西进行比较..

不确定这是否有意义,但您如何看待这个想法?

手术会不会太大?它有多准确?这个想法有意义吗?

【问题讨论】:

  • 哈希值更小,这就是它的用途:php.net/md5_file
  • @AbraCadaver 好的,谢谢! ;)

标签: 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()
  • 几兆字节的编码图像将是比较大的字符串。 md5_file 会更快。如果它存储在数据库中,它会稍微复杂一些,但我认为它仍然会更快。我还没有检查过,所以最好的解决方案是两个都试一下,看看哪个表现更好。
  • 这很适合比较字节数组(不是base64字符串)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多