今天在手动生成账号的token时需要先算出账号+salt的md5,发现在自己通过
md5sum
生成的md5一直被判断为无效值,用php的md5
函数生成的就可以。对比发现两种方式生成的md5值不同。不太明白其中缘由,上下探索一下。
先列下不同语言,不同平台上针对 hello, world
字符串生成的md5值。
-
Javascript Console(https://www.md5.cz/javascript-md5),这里使用的是页面上加载的这个md5库。
-
osx
md5
工具
从上面实验结果来看,在各种编程语言实现及MySQL内置的md5
函数计算结果是相同的,OSX上md5 -s 'hello, world'
的计算结果也正常。而在OSX和Linux上通过管道和文件的方式得到了相同的结果,但是是另外一个结果。
那为什么通过管道和文件的方式得到不一样的结果呢?
- 首先工具算法不应该出错的,这个先排除
- 检查文件内容,是不是有肉眼不容易分辨的字符
上二进制查看工具查看文件内容
通过观察发现有多出一个换行字符0A
,我们写入的字符是hello, world
12个字符,并没有添加换行符。通过ls
也发现了文件大小不对。
这里我们是通过echo
把内容重定向到文件的,那最大可能就是echo
自动添加了换行符。
查看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值也是我们所期望的了。
还是要熟练使用常用的命令行工具,对常用的参数要熟记于心呐。