跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个关于我的同事计算 md5 的问题!
未分類
11 12 月 2020

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

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

資深大佬 : BenchWidth 6

由于项目的设计需要项目中资源上传的时候都是需要上传 md5 来校验文件,我是负责的网页前端与 java 后端部分的。

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

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

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

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

大佬们,解决一下我的疑问吧!!!!!

大佬有話說 (100)

  • 資深大佬 : baijiahei

    同一文件 md5 值相同
    ios 端的看起来像 base64 后的 然后还有个空格 可能+号 后台接收的时候给过滤掉了
    说不好 但是 ios 端的肯定是不对的

  • 資深大佬 : binbinyouliiii

    你让他拿个简单字符算一下对比一下不就完了

  • 資深大佬 : ThirdFlame

    md5 值 是 16*8=128bit
    前端和 java 显示的是 hex 格式显示的。
    ios 貌似是 base64 编码后显示的(不过也和 前端和 java 算的不一样)

    同一个文件计算出来的 md 值( 128bit )是相同的,这是毋庸置疑的。

  • 資深大佬 : SjwNo1

    啊哈 不同的编程语言 md5 算法不一样吗 坐等下解答

  • 資深大佬 : louiswang002

    可能 iOS 端用了阿里云的工具类算出来的 md5,那个工具类里面有个函数,是 md5 之后 base64,这个值可以用于阿里云 oss 校验,可以让 iOS 的同事 review 代码

  • 資深大佬 : maro

    一个 32 位 一个 24 位 一个干脆是 base64

  • 資深大佬 : whileFalse

    都按照 linux 下的 md5sum 对齐,谁算出来和 md5sum 不一致就打回去重写

  • 資深大佬 : paullee

    啊,你们缺少有话语权的人,这玩意儿能算出 3 个版本,那你们其他业务的坑恐怕只多不少。建议参照 7 的建议。

  • 資深大佬 : Citrus

    安卓和 iso 他们和我说编程语言不一样算出来的就是不一样的

    建议把说这话的人开掉。

  • 資深大佬 : msg7086

    Z+L6tJUcklneku8zMPoqcw==
    对应的 hex 是
    67e2fab4951c9259de92ef3330fa2a73
    和你算出来的不一样。

    至于谁对谁错,各家 hash 工具解忧愁。

  • 資深大佬 : f6x

    @whileFalse 你歧视其他操作系统. 命名 mac 和 win 下也有 md5sum

  • 資深大佬 : longaiwp

    你管它哪个对哪个错,就按照 Linux 下的 md5sum 来,谁不一样就谁回去研究重写。

  • 資深大佬 : SjwNo1

    重点关照下这位 ios 同学,胡言乱语

  • 資深大佬 : ssynhtn

    这两个客户端都很优秀啊, 都是自己实现 md5 算法
    一般菜鸟都是网上找一段代码复制粘贴一下

  • 資深大佬 : Rehtt

    @f6x md5sum 本来最先出现在 linux 中,mac 和 win 都可以说是移植的

  • 資深大佬 : longaiwp

    另外你们这位做 iOS 的人,估计技术不过关,建议要他多学习。

  • 資深大佬 : keepeye

    你到网上找个 swift 的标准 MD5 算法扔给他。我估计他连 md5 是什么都不知道

  • 主 資深大佬 : BenchWidth

    @ssynhtn 他就是网上找的计算 md5 的方式。。也不晓得哪儿找的(这就很头大了)

  • 主 資深大佬 : BenchWidth

    @keepeye 我扔了一个 md5 标准算法,他说什么 ios 不能根据文件夹获取文件啥的,就是似乎拿不到文件的二进制流。。我也不懂 ISO 就没说什么了。

  • 主 資深大佬 : BenchWidth

    @Citrus 好残忍,哈哈哈

  • 資深大佬 : keepeye

    @BenchWidth 怎么可能无法读取呢?

  • 主 資深大佬 : BenchWidth

    @louiswang002 他在 csdn 找的代码只有 10 几行。。。

  • 資深大佬 : liushaokang

    哈哈哈哈哈,没想到还会有这种问题

  • 資深大佬 : misaka19000

    四五年前有幸和做 iOS 的人打过交道,那些人的水平真是菜

  • 資深大佬 : imdong

    让我想起之前一个同事,让他做一个上传文件去重的功能,一个星期过去了,没动静,过去一问,搞不定,不知道咋弄…

    我说用 md5 啊,你把上传的文件 md5 存数据库,每次上传检查数据库有么有记录嘛。

    他说好,然后又一个星期过去了,我问咋样了…他说每次上传的文件 md5 都不一样。

    我一看代码,呵:

    “`PHP

    md5($file_name);

    “`

    对不懂 PHP 的朋友们一个提示

    `md5 ( string $str [, bool $raw_output = false ] ) : string`

    我…后来他试用期没过,听说去了 OPPO,唉…

  • 資深大佬 : Rwing

    md5 是标准算法。。。。各语言肯定是一样的,如果不一样,说明有人错了。。。。

  • 主 資深大佬 : BenchWidth

    @keepeye 不知道,,我也很纳闷,我现在特别的懵逼。。。。毕竟我没写过 iOS 。昨天他解释的就是说 ISO 与安卓读取文件的方式不一样,什么什么文件拿不到之类的。我问他能到文件的二进制流嘛,他就说 iOS 啥的(不懂不懂听不懂!)

  • 資深大佬 : zhangxiaoming

    跟主一模一样的情况,最近一个月多起来的,软件批量搞的根本防不住。当看不见…

  • 資深大佬 : zhangxiaoming

    @zhangxiaoming
    不好意思回错帖子了…

  • 資深大佬 : RayJiang9

    如果 iOS 用的 Swift 的话,直接引入这个库,内置了多种算法 [CryptoSwift]( https://github.com/krzyzanowskim/CryptoSwift)
    不过还是建议开除 iOS

  • 主 資深大佬 : BenchWidth

    @RayJiang9 哈哈哈哈,你们好残忍

  • 資深大佬 : cht1995

    developer.apple.com/documentation/cryptokit/insecure/md5

  • 資深大佬 : YouLMAO

    老板发话了,算出正确 md5 的年终奖 10 个比特币,算错了倒扣 2 个,他们工资高让他们算

  • 資深大佬 : Woood

    他就说 iOS 啥的(不懂不懂听不懂!)
    莫名有看孔乙己的感觉

  • 資深大佬 : oneisall8955

    用脚想都知道能算一致的

  • 資深大佬 : yaocai321

    建议看了下 md5 的原理, 然后手写下, 花不了一天的时间

  • 資深大佬 : gamexg

    Java 的是 hex 格式,ios 的是 base64 格式,

    但是谁能介绍下,安卓的是什么格式? 32 进制??

  • 資深大佬 : des

    建议开除,骗鬼呢

  • 資深大佬 : louiswang002

    @BenchWidth 告诉他用 NSData 读取文件,然后再用这个对象 MD5,再不行让他去 aliyunoss 里面找 OSSUtil 这个工具类,找 MD5 的方法

  • 資深大佬 : way2explore2

    @gamexg 同好奇

  • 資深大佬 : cornetCat

    建议开除,不然后续的坑你会吐血

  • 主 資深大佬 : BenchWidth

    @gamexg 我刚看了看他的代码似乎把 16 进制转换成了 32 进,我重新找了 个文件。
    我算出来是 bfc918bf80386fa7f2784807c07860d8
    安卓算出来是 5vp4cbv01odujv4u280v07go6o
    他说他用的是安卓 sdk 的方法来获取的,不知道是不是被自动转成 32 进制了

  • 資深大佬 : mxT52CRuqR6o5

    有啥好疑问的,那两位水平不行
    你看看他们是培训机构出来的还是科班出来的

  • 主 資深大佬 : BenchWidth

    @louiswang002 好的

  • 資深大佬 : hatebugs

    这个水平,,

  • 資深大佬 : vanxy

    @BenchWidth #42 Android 的看起来就不像 md5 呀

    搜索一下, 复制粘贴,5 分钟搞定:
    https://juejin.cn/post/6844903444810055687

  • 資深大佬 : icyalala

    @Woood

    这 iOS 童鞋编译不报错了,涨红的脸色渐渐复了原,他人便又问道,“童鞋,你当真认会做 iOS ?” 他看着问他的人,显出不屑置辩的神气。他们便接着说道,“你怎的连 md5 都算不对呢?”他立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话;这回可是全是 block runtime 之类,一些不懂了。在这时候,众人也都哄笑起来:工位前后充满了快活的空气。

  • 資深大佬 : FreeEx

    我的天,建议面试官辞职谢罪

  • 資深大佬 : gefranks

    算不对还可以忍, 但是说编程语言不一样算出来的就是不一样的,建议开除。

  • 資深大佬 : php01

    这水平能找到工作,是不是应该反省一下公司的招聘录用流程?

  • 資深大佬 : superrichman

    安卓的可能是把 hmacmd5 当成 md5 用了

  • 資深大佬 : Jackeriss

    今日最佳

  • 資深大佬 : zszhere

    先统一 tohex()把格式整一致了再说
    如果还不一致就找个小文件做二进制的 bindiff

  • 資深大佬 : zqx

    md5 是一个给资源生成唯一标识的规则,不是具体算法吧,指定同一种算法,不同平台的结果肯定是一样的

  • 資深大佬 : dogfood

    牛逼 class

  • 資深大佬 : rigortek

    md5 都能有争议,还和语言有关?醉了!
    命令行一条 md5sum 结果就是三端看齐的标准
    iOS 绝对水货一个

  • 資深大佬 : sampeng

    今日最佳
    我说这样的留着过年?

  • 資深大佬 : richChou

    想起之前公司有个开发跟我说不同语言 Base64 Encode 之后的值不一样。

  • 資深大佬 : 360511404

    单看 iOS
    是不是跟你的结果一致,这个重要吗
    能得出这样的 md5 值的 iOS,你还留着过年吗
    他自己都不看一下自己的值,他不知道怎么看都铁定不是 md5 吗

  • 資深大佬 : ztxcccc

    @zqx md5 就是算法名,还有 md4 之类的,你也要多学习

  • 資深大佬 : 1s1s

    不敢看不敢看

  • 資深大佬 : djs

    直接好家伙,这辆端开发有毒

  • 資深大佬 : glennv2ex

    前端,java 后台看起来没问题 安卓的 25 位肯定不对 ios 的更离谱了

  • 資深大佬 : glennv2ex

    欺负你这个老后端

  • 主 資深大佬 : BenchWidth

    @glennv2ex 哭了哭了,太难了

  • 資深大佬 : guibin1989

    iOS 程序员风评被害,建议开除。

  • 資深大佬 : longaiwp

    @richChou 确实会有,哪怕都是 Jawa,Android 和 Jawa 原生的 Base64 也会有不同,内部的规则问题。但是这本质上不是哪个语言不能得出哪个样子的东西,只要你指定要哪样的,一定能搞出来的。

  • 資深大佬 : sss495088732

    0.0 不用标准库自己写,去百度 CV?

  • 資深大佬 : SjwNo1

    贵司的客户端能用吗哈哈

  • 資深大佬 : heliotrope

    @richChou 确实会不一样呀 字符编码 填充方式 都有可能不一样

  • 資深大佬 : zjddp

    提问:这三人至少有几个人有问题

  • 資深大佬 : huayumo

    哈哈哈,ios 的要笑死了

  • 資深大佬 : local

    这不至少 2 有问题吗

  • 資深大佬 : FallenTy

    建议换个 ios 。

  • 資深大佬 : local

    iOS 的看格式应该是 md5 后,又 base64 编码的结果

  • 資深大佬 : sarices

    md5 不是一般都是把结果生成 32 位十六进制数字吗,ios 和安卓是什么鬼算法

  • 資深大佬 : dddz97

    说今日最佳的,我觉得是这周最佳

  • 資深大佬 : pushback

    这两端的年轻人不讲武德

  • 資深大佬 : xloger

    Android 的你建议他用 Guava 算了。之前项目里是拷网上的代码有 OOM 问题,然后我自己去搜了下,发现大多中文资料不太靠谱,想用 NIO 结果遇到了一些问题,试来试去最后上 Guava 了。

    参考资料:(我的参考顺序)
    <http://blog.atomicer.cn/2017/05/16/%E4%BD%BF%E7%94%A8nio%E7%9A%84%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E8%AE%A1%E7%AE%97%E8%B6%85%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84MD5/>
    <https://www.cnkirito.moe/file-io-best-practise/>
    <https://www.jianshu.com/p/f81073adc67d>
    <https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java>

  • 資深大佬 : ReysC

    安卓和 IOS 的应该好好查查文档,并且贴个 MD5 的正则验证:

    ^([a-z0-9]{32})$ 来自 https://regexlib.com/REDetails.aspx?regexp_id=698

    说真的,看到 o 和 u 的时候,已经不知道是啥东西了。HEX 怎么能超过 F

    附赠:

    https://en.wikipedia.org/wiki/MD5

  • 資深大佬 : locoz

    “主要是安卓和 ios 他们和我说编程语言不一样算出来的就是不一样的,而且 ios 他说没法算出我这种 md5 数值。”
    很真实哈哈哈哈哈,见过好几个做客户端开发的都有类似情况,主要可能是理解不了,因为和做客户端的那些东西不是一个逻辑。

  • 資深大佬 : Elethom

    我来唱个反调,Android 和 iOS 端提供的 md5 都真的是 md5,不过 Android 是 32 进制的,iOS 的是 base64 encode 过的 raw data 。

    但是依然建议:
    – 开除这两位,不会转换标准 hex 字串留着过年?
    – 开除所有上说不是 md5 的,真的太鸡巴菜了

  • 資深大佬 : JDog

    我曾经一位 iOS 开发同事……

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

    我特么惊了,敢情 OC 实现的 http 协议没 body

  • 資深大佬 : a719031256

    把 ios 开发打一顿就对了,这明显是搞事嘛

  • 資深大佬 : Elethom

    @locoz
    iOS 自己的 crypto 库出来就是 raw data,直接输出字串就是 encode 过的,和语言没关系,和输出格式有关系。当然不会输出 hex 字串就是水平有问题,和「和做客户端的那些东西不是一个逻辑」没关系。

  • 資深大佬 : liman

    牛逼!耳机可完全被认为了

  • 資深大佬 : imdong

    @ReysC 补一下,正则限定范围应该是:^[a-f0-9]{32}$

    仅限小写。

  • 資深大佬 : wysnylc

    @JDog #83 冷知识,get 也可以放 body,但是非标准实现服务端不保证能正常接收

  • 資深大佬 : CatTom

    亲,这边建议您先去暴打一顿当初的面试官哟~

  • 資深大佬 : zpf124

    @zqx hash 哈希摘要算法,是一个笼统的算法规则,而 md5,sha1 sha256 都是具体的哈希算法实现,是已经规定好了具体算法思路的,不论什么平台什么工具算出来的 md5 值都应该是一样的。

  • 資深大佬 : zckevin

    啊这

  • 資深大佬 : fanjianhang

    好家伙颠覆了

  • 資深大佬 : lovecy

    @Elethom 我把主提供的 32 进制转成 16 进制,和他给的正确 md5 对不上啊。。

  • 資深大佬 : shawnsh

    水的一比,那大家换个 sha3 来校验吧,狗头

  • 資深大佬 : ReysC

    没用过 32 进制的 md5,顺道补充知识。
    日常看到 md5 就默认是 16 进制 HEX 。

    多谢大佬 @Elethom 说明

  • 主 資深大佬 : BenchWidth

    @xloger 好的,谢谢大佬!我发给他看看

  • 資深大佬 : devcat

    巧了,我也遇到同样的问题,就在前几天

  • 主 資深大佬 : BenchWidth

    @lovecy 刚刚找到问题了,文件比较小的他计算出来的值转换为 16 进制刚好是可以和我的 md5 对上。大文件他计算出来的就有问题了,

  • 資深大佬 : JKeita

    ios 那个是 MD5 ?你在搞笑?

  • 資深大佬 : JKeita

    MD5 是规范好吧,不同语言算出来的都应该一样。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具