一个关于我的同事计算 md5 的问题!

2020-12-24 09:42:53 +08:00
 BenchWidth
由于项目的设计需要项目中资源上传的时候都是需要上传 md5 来校验文件,我是负责的网页前端与 java 后端部分的。

昨天,ios 端的兄弟说有时候文件上传之后有时候地址是不能访问的(公司用的阿里云 oss )。我去看了一些发现了文件名有许多的奇奇怪怪的字符,被后台替换为空格了。我问了一些 ios 的兄弟他说的是算出来的 md5 值。我也问了一下安卓的兄弟,发现我们三端计算出来的文件 md5 都有自己的格式。(我自己写的前端和后端的计算方法得出的都是一样的 md5 )

前端,java 后台:2cf8510722f63a433865b7b244738b22
安卓:fuo0n0ga3rfs9qo5dd5qdmq8c
ios:Z L6tJUcklneku8zMPoqcw==

前端和 java 后台是我自己写所以怎么算都是一样的。主要是安卓和 iso 他们和我说编程语言不一样算出来的就是不一样的,而且 ios 他说没法算出我这种 md5 数值。

我想的是 md5 难道不都是通过获取文件的二进制流再进行一系列的算法得出的一个固定的值嘛,难道说在不同的地方读取出来的文件二进制流不一样?或者说是使用的算法不一样?还是说只是他们没有找到方法而已?还是说是我自己算错了。

大佬们,解决一下我的疑问吧!!!!!
15776 次点击
所在节点    问与答
134 条回复
locoz
2020-12-24 15:09:16 +08:00
“主要是安卓和 ios 他们和我说编程语言不一样算出来的就是不一样的,而且 ios 他说没法算出我这种 md5 数值。”
很真实哈哈哈哈哈,见过好几个做客户端开发的都有类似情况,主要可能是理解不了,因为和做客户端的那些东西不是一个逻辑。
Elethom
2020-12-24 15:20:11 +08:00
我来唱个反调,Android 和 iOS 端提供的 md5 都真的是 md5,不过 Android 是 32 进制的,iOS 的是 base64 encode 过的 raw data 。

但是依然建议:
- 开除这两位,不会转换标准 hex 字串留着过年?
- 开除所有楼上说不是 md5 的,真的太鸡巴菜了
JDog
2020-12-24 15:20:16 +08:00
我曾经一位 iOS 开发同事......

我: “传参比较大,放 body 里吧”
研究了半天以后....
同事: “iOS 这边好像没法把参数放 body 里,就 URL 传参吧”


我特么惊了,敢情 OC 实现的 http 协议没 body
a719031256
2020-12-24 15:23:18 +08:00
把 ios 开发打一顿就对了,这明显是搞事嘛
Elethom
2020-12-24 15:26:08 +08:00
@locoz
iOS 自己的 crypto 库出来就是 raw data,直接输出字串就是 encode 过的,和语言没关系,和输出格式有关系。当然不会输出 hex 字串就是水平有问题,和「和做客户端的那些东西不是一个逻辑」没关系。
liman
2020-12-24 15:26:58 +08:00
牛逼!耳机可完全被认为了
imdong
2020-12-24 15:42:58 +08:00
@ReysC 补一下,正则限定范围应该是:^[a-f0-9]{32}$

仅限小写。
wysnylc
2020-12-24 15:52:13 +08:00
@JDog #83 冷知识,get 也可以放 body,但是非标准实现服务端不保证能正常接收
CatTom
2020-12-24 15:52:35 +08:00
亲,这边建议您先去暴打一顿当初的面试官哟~
zpf124
2020-12-24 16:04:37 +08:00
@zqx hash 哈希摘要算法,是一个笼统的算法规则,而 md5,sha1 sha256 都是具体的哈希算法实现,是已经规定好了具体算法思路的,不论什么平台什么工具算出来的 md5 值都应该是一样的。
zckevin
2020-12-24 16:08:06 +08:00
啊这
fanjianhang
2020-12-24 16:10:25 +08:00
好家伙颠覆了
lovecy
2020-12-24 16:11:43 +08:00
@Elethom 我把楼主提供的 32 进制转成 16 进制,和他给的正确 md5 对不上啊。。
shawnsh
2020-12-24 16:11:46 +08:00
水的一比,那大家换个 sha3 来校验吧,狗头
ReysC
2020-12-24 16:15:16 +08:00
没用过 32 进制的 md5,顺道补充知识。
日常看到 md5 就默认是 16 进制 HEX 。

多谢大佬 @Elethom 说明
BenchWidth
2020-12-24 16:25:41 +08:00
@xloger 好的,谢谢大佬!我发给他看看
devcat
2020-12-24 16:26:33 +08:00
巧了,我也遇到同样的问题,就在前几天
BenchWidth
2020-12-24 16:42:10 +08:00
@lovecy 刚刚找到问题了,文件比较小的他计算出来的值转换为 16 进制刚好是可以和我的 md5 对上。大文件他计算出来的就有问题了,
JKeita
2020-12-24 16:42:29 +08:00
ios 那个是 MD5 ?你在搞笑?
JKeita
2020-12-24 16:43:14 +08:00
MD5 是规范好吧,不同语言算出来的都应该一样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/738468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX