这是我目前的设计:
我遇到的问题是有很多文件非常相似(相差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,值会完全改变。
新方法: 字节序列之间的距离。
答案 0 :(得分:1)
对于文本,计算差异的大小是两个文件相似或不相似的相对代理。
对于图像(和视频)来说,这是一个尚未正确解决的问题,因为我知道,所以我期望你能得到的最好的想法是玩弄它。
我认为可以通过分析图像的傅里叶变换来计算合理的OK代理。也许通过在某些方面将其标准化为幅度或带宽,通过消除低幅度频率,或通过采样,或者可能所有这些。
我担心我的信号处理能力太过于生气,无法准确地说出什么或如何。但如果您对所涉及的数学有一定的了解,那么它可能是一个领先者,并且有一个DSP堆栈交换,如果这确实是正确的方法,您可以购买最新的细节:
答案 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;。 它能够找到类似的文件,并确切地说明差异在哪里。