[20211011]計算sql_id.sh指令碼的一些補充.txt

lfree發表於2021-10-11

[20211011]計算sql_id.sh指令碼的一些補充.txt

--//前幾天改了計算sql_id的指令碼,同時發現一些問題.
--//我的計算如下:
v1=$(echo -e -n "$sql_text" | md5sum | sed 's/  -//' | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')

1.問題1:
--//別人問的問題,為什麼使用md5sum後,還有許多步驟,實際上計算出來的結果還要4個位元組對調一下,才是正確的full_hash_value.
--//對調我使用xxd -r -p | od -t x4完成.
--//我估計與CPU型別有關,INTEL系列的這樣計算沒有問題,其它都沒有環境,無法測試.

2.問題2:
--// md5sum後的過濾 sed 's/  -//'是多餘的.
--//cygwin下執行:
$ echo -e -n a | md5sum
0cc175b9c0f1b6a831c399e269772661 *-

--//linux下執行:
$ echo -e -n a | md5sum
0cc175b9c0f1b6a831c399e269772661  -
--//與linux的對比多出了一個*.
$ echo -e -n a | md5sum | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020

--//如果你仔細檢查發現轉換結果是對的.很明顯*-字元被xxd -r -p 給忽略了.

$ echo -n 0cc175b9c0f1b6a831c399e269772661 | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020

$ echo -n 0cc175b9c0f1b6a831c399e269772661a | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020

$ echo -n 0cc175b9c0f1b6a831c399e269772661az | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020

$ echo -n 0cc175b9c0f1b6a831c399e269772661ab | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020 000000ab
0000021

$ echo -n 0cc175b9c0f1b6a831c399e269772661AC | xxd -r -p | od -t x4
0000000 b975c10c a8b6f1c0 e299c331 61267769
0000020 000000ac
0000021

--//注意看輸出,我在結尾增加a,az,ab.可以發現單個字元a結果不變,加入ab,輸出結果發生變化.
--//結尾加入az,與加入a結果一樣,也就是要對齊邊界.
--//可以發現xxd -r -p僅僅接受16進位制字元0-9,a-f,A-F.
--//最佳方式修改如下:

v1=$(echo -e -n "$sql_text" | md5sum | awk "{print $1}" | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z')

$ echo -e -n a | md5sum | awk "{print $1}" | xxd -r -p | od -t x4 |  sed   -n  -e 's/^0\+ //' -e 's/ //gp' | tr 'a-z' 'A-Z'
B975C10CA8B6F1C0E299C33161267769


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2795255/,如需轉載,請註明出處,否則將追究法律責任。

相關文章