我正在运行一些我用C编写的代码,它从别人写的哈希库(md5.c&md5.h)中调用md5哈希函数。 我看到的奇怪的行为是:
散列工作完美=我散列一个string,它出来的确切散列,我已经validation它与其他多个来源。
散列function在我的OSX机器上编译和运行时非常有效,计算出来的散列与其应该完全相同。
相同的代码,不会在基于Linux的服务器上上传和编译更改,并计算不同的(错误的)散列值。
为什么windows.h禁用包警告?
htons()在Big-Endian系统上做什么?
C链接阶段不会产生警告
使用xcvdata不起作用删除标准TCP IP端口
Hook函数调用linux mint
有没有人有任何的见解,究竟这将是可能的? 它在过去的一周里一直疯狂,我不明白为什么这是可能的。 我也在另一台机器上进行了testing,编译并执行,效果很好。 它只是当我上传到服务器的散列不再是正确的。
散列函数文件可以在http://people.csail.mit.edu/rivest/Md5.cfind
解决:谢谢大家这是64位的拱问题。 它的强大的烦人,这下滑了我的脑海,考虑debugging时…….
通过unix域套接字传递结构
Windows服务中的关键事件处理C#
windows – 从c ++中的服务访问剪贴板
在Windows桌面/控制台或Linux控制台应用程序中,我们可以使用FireBase云消息传递来发送还是接收消息,或使用C ++吗?
使用QProcess在C ++中redirectgnome-terminal的输出
尝试替换(Md5.c第41行)
typedef unsigned long int UINT4;
通过
typedef uint32_t UINT4;
(如果需要的话包括stdint.h)
在长64位的机器上,int(通常)是64位而不是32位
编辑 :
我尝试了64位opteron这解决了这个问题。
机器似乎没有在其他架构上工作(32位和64位)? 如果MD5实现依赖于机器字大小(我没有检查代码),这可能会导致散列不同。
不同的编译器可以有不同级别的标准合规性。 如果你碰到一个不合标准的编译器,你可能很难看到经过良好测试的代码被编译成完全不同的东西。
目标系统也可能是64位,代码有64位可移植性问题。
解决这个问题的唯一方法就是调试你的代码的两个版本的行为有什么不同。
你确定你正在阅读二进制模式? 否则,换行符将在不同的操作系统中进行不同的转换。
抱歉,没有。 如果我编译并在我的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的问题。