我们有一个产品,用户可以添加各种文件进去,我们希望能够识别出某些文件是添加过的。
靠文件名肯定不行。
后来我们想到了base64码,我想问一下,如果我们用base64位前100位作为id,是否可以做到“几乎”无误地识别重复添加?
多谢
我们有一个产品,用户可以添加各种文件进去,我们希望能够识别出某些文件是添加过的。
靠文件名肯定不行。
后来我们想到了base64码,我想问一下,如果我们用base64位前100位作为id,是否可以做到“几乎”无误地识别重复添加?
多谢
首先,Base64被设计出来,主要是因为二进制数据不利于分享和传输,传输中,很可能会丢失二进制字节导致数据错误
所以,Base64被设计出来,将二进制数据转化成数字和英文字符,以便确保在传输过程中不会被某些编辑器之类的去除字节而导致错误
由于Base64设计初衷就不是用来做数据摘要的,所以不完全的Base64并不能作为整段数据的数据指纹
另外,就Base64的计算方法而言,它编码之后的数据顺序,和原来二进制的顺序是一致的
所以,Base64前100个字符,并不能表示唯一的文件
如果两个文件前面80个左右的字节一样,由于Base64编码和二进制顺序一致,所以前100位Base64也会一致,因此不能当做数据指纹使用
一般的方法是,用MD5计算整个文件数据,作为文件名,MD5是数据摘要算法,一般而言,数据相同的,MD5也相同,数据不同的MD5也不同(少数情况下不同内容有相同的MD5)
而我的一般做法是,使用SHA1算法计算整个文件数据作为文件名,SHA1算法一般用于数字签名,所以也可以当做是文件的数据指纹使用,可以确保相同文件的SHA1的唯一性;SHA1比起MD5而言,出现不同内容有相同值的几率要小的多,所以更适合用来做文件的数据指纹
你应该先了解一下base64是什么。。。
base64也就是将字符串转化成指定字符集[a-zA-Z0-9+/]的字符串而已.如果文件内容变化的部分靠后,是无法反应出
来的。
说正经的:
一般都是用 文件摘要算法 来辨别。 就像楼上几个说的, MD5 是一个不错的选择。
Python https://docs.python.org/3/lib...
PHP http://php.net/manual/zh/func...
Node https://www.npmjs.com/package...
通用的做法都是用文件的md5来校验文件是否有修改,或是否重复
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
难,100位base64不过75字节,可能一个文件头都不够。有什么不能用正经摘要算法的理由吗?