找到一些类似的文件

时间:2014-12-02 13:20:16

标签: php file hash

这是我目前的设计:

  1. 用户上传文件
  2. 服务器检查文件的sha256以查看它是否已存在
  3. 如果文件尚不存在: 将文件重命名为sha256哈希,将文件的原始名称存储在数据库中,并将该文件的sha256存储。 除此以外 将另一个条目添加到数据库,而不将文件存储在服务器上。
  4. 我遇到的问题是有很多文件非常相似(相差0.1%或更少),这对大多数视频和图像来说都是微不足道的。 大多数这些文件大约10MB,但有些文件更大。 我试图找到一种更好的方法来查找类似的文件,并最终只保存类似文件之间的差异,而不是必须存储两者。

    我尝试了几种不同的方法,但是它们都非常挑剔,不能处理二进制文件,或者无法处理大于几千字节的文件。到目前为止,我正在考虑制作我自己的哈希方法,它将做类似的事情:

    $a=strlen($f);
    $p=$a/1000;
    $hash='';
    
    for($c=0; $c<1000; $c++)
    {
    $ll='';
    for($i=0; $i<=$p; $i++)
    {
    $ll+=ord(substr($f, $c*$a/1000 + $i, 1));
    }
    $hash.=chr($ll%26 + 65); //at the end, this is going to be a 1000 character hash.
    }
    

    上面的代码对于具有相同大小的文件非常有用,但对于不同大小的文件它几乎没用..

    嗯。我将尝试检查文件的属性,而不是尝试使用散列进行任何操作...现在我只是要做相同值的连续字节数&#39;或类似的东西。 更新:没有按计划运行。通过向100MB文件添加仅10kb,值会完全改变。

    新方法: 字节序列之间的距离。

2 个答案:

答案 0 :(得分:1)

对于文本,计算差异的大小是两个文件相似或不相似的相对代理。

对于图像(和视频)来说,这是一个尚未正确解决的问题,因为我知道,所以我期望你能得到的最好的想法是玩弄它。

我认为可以通过分析图像的傅里叶变换来计算合理的OK代理。也许通过在某些方面将其标准化为幅度或带宽,通过消除低幅度频率,或通过采样,或者可能所有这些。

我担心我的信号处理能力太过于生气,无法准确地说出什么或如何。但如果您对所涉及的数学有一定的了解,那么它可能是一个领先者,并且有一个DSP堆栈交换,如果这确实是正确的方法,您可以购买最新的细节:

http://dsp.stackexchange.com

答案 1 :(得分:0)

经过许多不同的设计之后,我最终得到了这些:

$f=file_get_contents($l['sha1']);

$a=strlen($f);
$ff='';
for($xd=0; $xd<=$a; $xd++)
{
$ff.=chr(ord(substr($f, $xd, 1))%26 + 65);
}

$hash='';
$toFind='AAA';
$start = 0;
$pos=0;
while(($pos = strpos(($ff),$toFind,$start)) !== false) {
        $hash.=chr(abs($start-$pos)%93 + 32);
        $start = $pos+1; // start searching from next position.
}

$hash=substr($hash,0,19999);

令人惊讶的是,这适用于10MB以下的文件, 对于大于10MB的文件&#39; $ toFind&#39;字符串更改为&#39; AAAA&#39;。 它能够找到类似的文件,并确切地说明差异在哪里。