我将要使用一种算法来编码可变长度但很长的字符串,该字符串是从XML文件检索的字段,然后该编码数据应保留在数据库中。

稍后,当我收到第二个文件时,我需要从数据库(先前存储的)中获取编码数据,然后对其进行解码并使用新数据进行验证以确保重复。

我尝试了org.apache.commons.codec.binary.Base64
它有2种方法:

  • encodeBase64(Byte[] barray)
  • decodeBase64(String str)

  • 可以很好地解决我的问题。
    但是它将55个字符的字符串转换为6个字符的字符串。

    因此,我想知道是否存在这些算法将2个非常大且仅具有1个字符不匹配(例如)的字符串编码到相同的编码字节数组中的情况。

    我对Base64类知之甚少,但是如果有人可以帮助我,它将非常有帮助。

    如果您可以建议使用其他任何算法,使长度固定长度的大String短并且可以解决我的目的,我将很乐意使用它。

    提前致谢。

    最佳答案

    不是很有效。

    同样,使用sun.misc类提供了不可移植的应用程序。

    查看MiGBase64的以下性能比较:





    Base64不是哈希算法,它是一种编码,因此必须是双向的。必须避免冲突-否则解码将是不确定的。 Base64旨在表示ASCII字符串中的任意二进制数据。将Unicode字符串编码为Base64通常会增加所需的代码点数,因为Unicode字符集需要多个字节。 Unicode字符串的Base64表示形式将根据所使用的编码(UTF-8,UTF-16)而有所不同。例如:

    Base64( UTF8( "test" ) ) => "dGVzdA=="
    Base64( UTF16( "test" ) ) => "/v8AdABlAHMAdA=="
    

    解决方案1

    使用无损压缩
    GZip( UTF8( "test" ) )
    

    在这里,您将字符串转换为字节数组,并使用无损压缩来减少必须存储的字节数。您可以更改char编码和压缩算法,以减少字节数,具体取决于要存储的字符串(即,如果大多数为ASCII,则UTF-8可能是最佳选择。

    优点:无冲突,能够恢复原始字符串
    缺点:存储值所需的字节是可变的;默认值为0。存储值所需的字节更大

    解决方案2

    使用哈希算法
    SHA256( UTF8( "test" ) )
    

    在这里,您将使用哈希函数将字符串转换为固定长度的字节集。散列是单向的,其本质是collisions can be possible。但是,根据您希望处理的字符串的配置文件和数量,可以选择一个哈希函数以最大程度地减少冲突的可能性

    优点:存储值所需的字节是固定的;存储值所需的字节很小
    缺点:可能发生冲突,无法恢复原始字符串

    关于java - Java中BASE64类的编码/解码算法的效率如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6355704/

    10-10 14:04
    查看更多