[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博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2795255/ ,如需转载,请注明出处,否则将追究法律责任。