求字节数组转最短字符串的方法,最好是 C#实现

2019-03-06 09:31:06 +08:00
 daijinming

对文件进行 MD5 hash 算法后,得到一个 字节数组,为了便于通过 URL 进行保存,需要将字节数组转字符串,默认算法在这里 输出的字符串类似:831a3cf0f43dc6b1f12a75fa22ed3bf5,32 位,感觉有点长。

2245 次点击
所在节点    程序员
14 条回复
congeec
2019-03-06 09:33:25 +08:00
最短字符串怎么定义的?
关键词 hexdigest
SeaRecluse
2019-03-06 09:33:43 +08:00
你取前 6 位或者 8 位就行了,不用存完
daijinming
2019-03-06 09:34:47 +08:00
@congeec 10 位左右吧
lihongjie0209
2019-03-06 09:35:42 +08:00
MD5 消息摘要算法(英语:MD5 Message-Digest Algorithm ),一种被广泛使用的密码散列函数,可以产生出一个 128 位( 16 字节)的散列值( hash value ),用于确保信息传输完整一致。MD5 由美国密码学家罗纳德·李维斯特( Ronald Linn Rivest )设计,于 1992 年公开,用以取代 MD4 算法。


128 位

一个 16 进制可以表示 4 位

128 / 4 = 32

这么看来你只能用更高进制的表示了
daijinming
2019-03-06 09:36:11 +08:00
@SeaRecluse 你说的方法有一定道理,可我还是有些担心,毕竟我是用来做小文件的查重,如果重复了怎么办。
lihongjie0209
2019-03-06 09:38:25 +08:00
更高进制为什么没使用, 参考: https://www.zhihu.com/question/37657503
rogwan
2019-03-06 09:39:30 +08:00
键盘上的字符就这么多,64 进制可以了,用于 URL 避免斜杠和等号。
SeaRecluse
2019-03-06 09:39:47 +08:00
@daijinming 做小文件的查重第一步不要用 md5,先用一个短摘要算法(名字我给忘了 orz,好像是生成 16 位的)进行粗略查重,然后在这些相同的再进行 md5 测试
janxin
2019-03-06 10:00:27 +08:00
@SeaRecluse 先用 CRC16 或者 CRC32 查重然后 md5 吧
daijinming
2019-03-06 10:31:15 +08:00
@janxin
@SeaRecluse 两位意见中肯,我采用 crc16 代码+ md5(每 8 个 byte 取一个),这样整体还不到 10 位字符
pkoukk
2019-03-06 10:31:58 +08:00
java 里有 16 位 md5,但是它的值其实是 32 位里的 9-24 位。如果你要筛查的文件数不是天文数字,一般是够用的
yicong135
2019-03-06 11:00:02 +08:00
你是不是需要这个 BitConverter.ToString(byte[] bytes)
c4f36e5766583218
2019-03-06 11:05:08 +08:00
了解下:
1. java8: java.util.Base64#getUrlEncoder()
2. org.apache.commons.codec.binary.Base64#Base64(boolean)
3. com.google.common.io.BaseEncoding#base64Url()
4. base58??
hiouyuu
2019-03-06 14:17:36 +08:00

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

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

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

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

© 2021 V2EX