为什么我md5得到的结果与别人不一样

日月星辰 发布在Programming

今天在手动生成账号的token时需要先算出账号+salt的md5,发现在自己通过md5sum生成的md5一直被判断为无效值,用php的md5函数生成的就可以。对比发现两种方式生成的md5值不同。不太明白其中缘由,上下探索一下。

先列下不同语言,不同平台上针对 hello, world字符串生成的md5值。

image

从上面实验结果来看,在各种编程语言实现及MySQL内置的md5函数计算结果是相同的,OSX上md5 -s 'hello, world'的计算结果也正常。而在OSX和Linux上通过管道和文件的方式得到了相同的结果,但是是另外一个结果。

那为什么通过管道和文件的方式得到不一样的结果呢?

上二进制查看工具查看文件内容
image
通过观察发现有多出一个换行字符0A,我们写入的字符是hello, world 12个字符,并没有添加换行符。通过ls也发现了文件大小不对。
image
这里我们是通过echo把内容重定向到文件的,那最大可能就是echo自动添加了换行符。

image

查看echo文档,黑底白字写着,会添加换行符,如果不添加换行符,使用参数 -n或在字符串末尾添加\c

echo -n "hello, world" > n.txt
➜ ls -lh n.txt 
-rw-r--r-- 1 root root 12 4月  12 02:06 n.txt
➜ echo "hello, world\c" > t.txt
➜ ls -lh t.txt 
-rw-r--r-- 1 root root 12 4月  12 02:06 t.txt
➜   
➜ md5sum n.txt 
e4d7f1b4ed2e42d15898f4b27b019da4  n.txt

验证后的确是这样子的。不带换行的文件得到的md5值也是我们所期望的了。

还是要熟练使用常用的命令行工具,对常用的参数要熟记于心呐。