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

Igo*_* V. 3 bash hashsum files checksum integrity

两个包含相同歌曲的文件,都是 M4A 格式,当我计算它们的哈希时输出两个不同的结果:

md5sum
f149e2d2a232a410fcf61627578c101a  new.m4a
ad26ed675342f0f45dcb5f9de9d586df  old.m4a
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

唯一真正的区别是该old.m4a文件是在 2020 年 12 月下载的,并且new.m4a是在几个小时前下载的。

如果需要,您可以new.m4a 在此处old.m4a 此处下载。最初,两者都是从艺术家的 Bandcamp 页面下载的。

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

ibu*_*fen 13

打印的元数据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
Run Code Online (Sandbox Code Playgroud)

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

创建 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
Run Code Online (Sandbox Code Playgroud)

例如:

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
          |___________||___________|
Run Code Online (Sandbox Code Playgroud)

然后通过转换为日期:

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
Run Code Online (Sandbox Code Playgroud)