最少的字节来标识文件

时间:2019-01-25 09:33:12

标签: algorithm search hash heuristics

我目前正在做一个小项目,事实证明这是一个挑战。这是设置:我有一个相当老的处理器,用于各种各样的产品。大约有500种适用于各种应用程序的固件版本。它们有时相差几个字节〜1k,其他时候只共享5%。现在,我想通过为其创建一个唯一的标识符来标识每个版本。我已经将固件固件二进制文件作为可以使用和训练的文件来提供。

目标是,当有任何设备出现时,我希望尽可能少地读取已安装固件的字节,因为9600 Baud的连接速度相当慢。即使固件总共只有64k左右,但要完全读取它也需要花费一些时间(由于协议开销,时钟速度等因素,大约需要5分钟)

我正在考虑一些逻辑,该逻辑将解析存储的固件文件并确定可以使用其字节中的哪一个来唯一地标识它。无论何时有设备通过,它都会互相读取每个指纹字节,这与旧的T9文本预测非常相似,以缩小候选范围,直到找到正确的固件。为此,我需要建立一个数据库,其中包含最优化的指纹字节集。但是如何训练呢?如何找到500个文件中的最高有效字节?

到目前为止,我已经尝试对文件进行统计分析,并找出文件之间差异最大的前50个字节。问题是,即使占用了50个字节,我也会得到创建相同哈希值的多个版本。

任何可能解决该问题的建议或算法都将受到欢迎! 如果您有一个完全不同的方法的想法,我很想听听!

1 个答案:

答案 0 :(得分:5)

标识值可能不同的所有字节位置。然后找到“最有效的分割器”,即探测值的位置会将当前集合分割为最小子集(在最小最大意义上)或更多子集。

然后递归地对每个子集重复整个过程。这将产生一个决策树,为您提供(希望较短的)字节序列进行测试。

这是一种启发式方法,可能不是最优的,我希望

  • 计算过程不太长(尽管它将全部运行一次),
  • 距离最优目标不远。

假设每个拆分都是平衡的,但每次都是两个子集,则测试序列不会超过10个字节。