两个据称相同的 M4A 文件给出了不同的哈希结果。为什么?

两个据称相同的 M4A 文件给出了不同的哈希结果。为什么?

两个包含同一首歌曲的文件(均为 M4A 格式)在计算它们的哈希值时输出两个不同的结果:

md5sum
f149e2d2a232a410fcf61627578c101a  new.m4a
ad26ed675342f0f45dcb5f9de9d586df  old.m4a

它们包含相同数量的字节:

ls -l
-rw-rw-r-- 1 cdc cdc 2978666 Jun 26 19:49 new.m4a
-rwxrwxr-x 1 cdc cdc 2978666 Jun 26 19:49 old.m4a

exiftool仅在创建日期方面有所不同(帕斯特宾为了new.m4a帕斯特宾为了old.m4a)。

我使用 Audacity 的工具来比较两个文件(通过反转和混合它们,这使它们消除了彼此的相似性),结果是沉默,因为没有留下任何东西,这意味着两个文件之间没有区别。

命令cmp给我:

cmp -l
     54 375  23
     55  51 305
     56  41 112
     58 375  23
     59  51 305
     60  45 116
    170 375  23
    171  51 305
    172  41 112
    174 375  23
    175  51 305
    176  41 112
    270 375  23
    271  51 305
    272  41 112
    274 375  23
    275  51 305
    276  41 112

cmp -b
new.m4a old.m4a differ: byte 54, line 1 is 375 M-}  23 ^S

唯一的真实的不同之处在于该old.m4a文件是在 2020 年 12 月下载的,并且new.m4a是在几个小时前下载的。

需要的话可以下载new.m4a 这里old.m4a 这里。最初,两者都是从艺术家的 Bandcamp 页面下载的。

PS 我的人耳说这两者是相同的。

答案1

打印的元数据exiftool是文件数据的一部分。 IE:

$ diff <(exiftool old.m4a) <(exiftool new.m4a)
2c2
< File Name                       : old.m4a
---
> File Name                       : new.m4a
18,19c18,19
< Create Date                     : 2020:12:31 18:13:30
< Modify Date                     : 2020:12:31 18:13:34
---
> Create Date                     : 2021:06:26 18:57:37
> Modify Date                     : 2021:06:26 18:57:41
32,33c32,33
< Track Create Date               : 2020:12:31 18:13:30
< Track Modify Date               : 2020:12:31 18:13:30
---
> Track Create Date               : 2021:06:26 18:57:37
> Track Modify Date               : 2021:06:26 18:57:37
40,41c40,41
< Media Create Date               : 2020:12:31 18:13:30
< Media Modify Date               : 2020:12:31 18:13:30
---
> Media Create Date               : 2021:06:26 18:57:37
> Media Modify Date               : 2021:06:26 18:57:37

(这是在使两个文件具有相同的文件日期之后 - 就像存储在磁盘上的日期一样 - 而不是存储的肉数据文件)

md5 sum 创建时全部数据被使用。由于字节不同,校验和也不同。

也就是说;这音频数据是一样的。


除此之外,cmp您还可以执行十六进制转储来查看原始差异。

例如(跳过前 50 个字节,最多 300 个类型 hex ):

$ diff <(od -j 50 -N 300 -t x1 old.m4a) <(od -j 50 -N 300 -t x1 new.m4a)
1c1
< 0000062 00 00 dc 13 c5 4a dc 13 c5 4e 00 00 ac 44 00 71
---
> 0000062 00 00 dc fd 29 21 dc fd 29 25 00 00 ac 44 00 71
8c8
< 0000242 68 64 00 00 00 07 dc 13 c5 4a dc 13 c5 4a 00 00
---
> 0000242 68 64 00 00 00 07 dc fd 29 21 dc fd 29 21 00 00
14,15c14,15
< 0000402 00 20 6d 64 68 64 00 00 00 00 dc 13 c5 4a dc 13
< 0000422 c5 4a 00 00 ac 44 00 71 bc 00 55 c4 00 00 00 00
---
> 0000402 00 20 6d 64 68 64 00 00 00 00 dc fd 29 21 dc fd
> 0000422 29 21 00 00 ac 44 00 71 bc 00 55 c4 00 00 00 00

例如:

OLD: 00 00 dc 13 c5 4a  dc 13 c5 4e 00 00 ac 44 00 71
          |___________||___________|
---
NEW: 00 00 dc fd 29 21  dc fd 29 25 00 00 ac 44 00 71
          |___________||___________|

然后通过转换为日期:

m4a 使用 Apple Mac OS X HFS+ 时间戳(自格林尼治标准时间 1904 年 1 月 1 日午夜以来的秒数)。

old:
dc 13 c5 4a => 3692283210 => Thursday, December 31, 2020 18:13:30
dc 13 c5 4e => 3692283214 => Thursday, December 31, 2020 18:13:34

new:
dc fd 29 21 => 3707578657 => Saturday, June 26, 2021 18:57:37
dc fd 29 25 => 3707578661 => Saturday, June 26, 2021 18:57:41

相关内容