Bash

兩個據稱相同的 M4A 文件給出了不同的雜湊結果。為什麼?

  • June 27, 2021

兩個包含相同歌曲的文件,都是 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輸出僅在創建日期上有所不同(pastebin fornew.m4apastebin forold.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我的人耳說這兩者是相同的。

列印的元數據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

引用自:https://unix.stackexchange.com/questions/655955