V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

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

  •  
  •   daijinming · 2019-03-06 09:31:06 +08:00 · 2051 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    14 条回复    2019-03-06 14:17:36 +08:00
    congeec
        1
    congeec  
       2019-03-06 09:33:25 +08:00
    最短字符串怎么定义的?
    关键词 hexdigest
    SeaRecluse
        2
    SeaRecluse  
       2019-03-06 09:33:43 +08:00
    你取前 6 位或者 8 位就行了,不用存完
    daijinming
        3
    daijinming  
    OP
       2019-03-06 09:34:47 +08:00
    @congeec 10 位左右吧
    lihongjie0209
        4
    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
        5
    daijinming  
    OP
       2019-03-06 09:36:11 +08:00
    @SeaRecluse 你说的方法有一定道理,可我还是有些担心,毕竟我是用来做小文件的查重,如果重复了怎么办。
    lihongjie0209
        6
    lihongjie0209  
       2019-03-06 09:38:25 +08:00
    更高进制为什么没使用, 参考: https://www.zhihu.com/question/37657503
    rogwan
        7
    rogwan  
       2019-03-06 09:39:30 +08:00 via Android
    键盘上的字符就这么多,64 进制可以了,用于 URL 避免斜杠和等号。
    SeaRecluse
        8
    SeaRecluse  
       2019-03-06 09:39:47 +08:00
    @daijinming 做小文件的查重第一步不要用 md5,先用一个短摘要算法(名字我给忘了 orz,好像是生成 16 位的)进行粗略查重,然后在这些相同的再进行 md5 测试
    janxin
        9
    janxin  
       2019-03-06 10:00:27 +08:00
    @SeaRecluse 先用 CRC16 或者 CRC32 查重然后 md5 吧
    daijinming
        10
    daijinming  
    OP
       2019-03-06 10:31:15 +08:00
    @janxin
    @SeaRecluse 两位意见中肯,我采用 crc16 代码+ md5(每 8 个 byte 取一个),这样整体还不到 10 位字符
    pkoukk
        11
    pkoukk  
       2019-03-06 10:31:58 +08:00
    java 里有 16 位 md5,但是它的值其实是 32 位里的 9-24 位。如果你要筛查的文件数不是天文数字,一般是够用的
    yicong135
        12
    yicong135  
       2019-03-06 11:00:02 +08:00
    你是不是需要这个 BitConverter.ToString(byte[] bytes)
    c4f36e5766583218
        13
    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??
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3792 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:32 · PVG 18:32 · LAX 03:32 · JFK 06:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.