我正在运行一些我用C编写的代码,它从其他人编写的散列库中调用md5散列函数(md5.c& md5.h)。我一直看到的奇怪的行为是:
散列工作完美=我散列一个字符串,它出现了我已经验证它与多个其他来源的确切散列。
哈希功能有效 在编译和运行时非常完美 在我的OSX机器上和哈希那个 计算完全正确 是
相同的代码,不会上传任何更改 并在基于Linux的编译 服务器,它计算不同的 (错)哈希。
有没有人对如何做到这一点有任何见解?过去一周它一直在疯狂,我不明白为什么这是可能的。我也在另一台机器上进行了测试,编译和执行,它完美无缺。就在我将其上传到服务器时,哈希不再正确。
散列功能文件可在以下位置找到: http://people.csail.mit.edu/rivest/Md5.c
求助:谢谢大家 这是64位拱门问题。在调试.......
时,我的脑子里想到了它的强大烦恼答案 0 :(得分:21)
尝试替换(Md5.c第41行)
typedef unsigned long int UINT4;
通过
typedef uint32_t UINT4;
(如果需要,请包括stdint.h)
在64位机器上,long int(通常)是64位长而不是32位
编辑:
我尝试了64位的opteron,这解决了这个问题。
答案 1 :(得分:2)
该机器似乎没有使用与其他架构不同的架构(32位与64位)?如果MD5实现依赖于机器字大小(我没有检查代码),这可能导致散列不同。
答案 2 :(得分:1)
不同的编译器可以具有不同级别的标准合规性。如果你遇到一个低于标准的编译器,那么很难看到经过充分测试的代码被编译成完全不同的代码。
目标系统也可能是64位且代码具有64位可移植性问题。
解决问题的唯一方法是调试代码的两个版本的不同之处。
答案 3 :(得分:0)
抱歉,没有。如果我编译并在我的linux x86盒子上运行它,它会产生与md5sum实用程序相同的结果:
peregrino:$ md5sum csrc/Md5.c d27fd5f04426a3ccb2390d7517f21b9c csrc/Md5.c peregrino:$ bin/Md5 csrc/Md5.c d27fd5f04426a3ccb2390d7517f21b9c csrc/Md5.c
在我的x64包装盒上:
sandiego:$ bin/Md5 src/Md5.c 09679964608e3335c5c3e14572373eef src/Md5.c
所以它似乎是64位问题,而不是Linux问题。
答案 4 :(得分:0)
您确定要以二进制模式阅读吗?否则换行将在不同的操作系统中以不同方式转换。