我为一个不同的功能采用了一种方法,计算一个修改过的文件中有多少数据是新的,也许对你也有用。
我有一个C#的diff/patch实现,允许我取两个文件,大概是同一个文件的新旧版本,并计算 "差异",但不是通常意义上的差异。基本上,我计算了一组操作,我可以对旧版本进行更新,使其具有与新版本相同的内容。
为了将其用于最初描述的功能,看看有多少数据是新的,我简单地跑了一遍操作,对于每个从旧文件逐字复制的操作,都有一个0因子,每个插入新文本的操作(作为补丁的一部分分发,因为它没有出现在旧文件中)都有一个1因子。所有的字符都被赋予了这个工厂,这基本上给了我一个0和1的长列表。
然后我所要做的就是统计0和1的数量。在你的案例中,在我的实现中,1的数量比0的数量少,就意味着文件非常相似。
这种实现方式还可以处理这样的情况:修改后的文件不按顺序插入了旧文件的副本,甚至是重复的副本(即你从文件的开头复制了一个部分,然后粘贴到底部附近),因为它们都是旧文件中同一个原始部分的副本。
我曾尝试对副本进行称重,使第一份副本算作0,而相同字符的后续副本的系数逐渐增大,以便给复制/粘贴操作一些 "新的因素",但我从未完成,因为这个项目被废止了。