使用Base64的前100位来识别文件是否重复,请问这个方法可靠吗?

我们有一个产品,用户可以添加各种文件进去,我们希望能够识别出某些文件是添加过的。
靠文件名肯定不行。

后来我们想到了base64码,我想问一下,如果我们用base64位前100位作为id,是否可以做到“几乎”无误地识别重复添加?

多谢

阅读 7.4k
9 个回答

难,100位base64不过75字节,可能一个文件头都不够。有什么不能用正经摘要算法的理由吗?

请使用正经的摘要算法而不要自己原创

  • 首先,Base64被设计出来,主要是因为二进制数据不利于分享和传输,传输中,很可能会丢失二进制字节导致数据错误

  • 所以,Base64被设计出来,将二进制数据转化成数字和英文字符,以便确保在传输过程中不会被某些编辑器之类的去除字节而导致错误

  • 由于Base64设计初衷就不是用来做数据摘要的,所以不完全的Base64并不能作为整段数据的数据指纹

  • 另外,就Base64的计算方法而言,它编码之后的数据顺序,和原来二进制的顺序是一致的

  • 所以,Base64前100个字符,并不能表示唯一的文件

  • 如果两个文件前面80个左右的字节一样,由于Base64编码和二进制顺序一致,所以前100位Base64也会一致,因此不能当做数据指纹使用

  • 一般的方法是,用MD5计算整个文件数据,作为文件名,MD5是数据摘要算法,一般而言,数据相同的,MD5也相同,数据不同的MD5也不同(少数情况下不同内容有相同的MD5)

  • 而我的一般做法是,使用SHA1算法计算整个文件数据作为文件名,SHA1算法一般用于数字签名,所以也可以当做是文件的数据指纹使用,可以确保相同文件的SHA1的唯一性;SHA1比起MD5而言,出现不同内容有相同值的几率要小的多,所以更适合用来做文件的数据指纹

为什么不用md5呢?

对文件做MD5摘要吧。
但凡文件发生过改动,MD5摘要会发生变化。

目前比较通用的方法是 MD5

你应该先了解一下base64是什么。。。

base64也就是将字符串转化成指定字符集[a-zA-Z0-9+/]的字符串而已.如果文件内容变化的部分靠后,是无法反应出

来的。

说正经的:

一般都是用 文件摘要算法 来辨别。 就像楼上几个说的, MD5 是一个不错的选择。

MD5啊 你的需求基本就是文件服务器去重呗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题