Java中BASE64类的编码/解码算法效率如何?

Sub*_*Pal 5 java base64 encoding apache-commons-codec string-decoding

我将使用一种算法来编码从XML文件中检索的可变长度但非常长的String字段,然后该编码数据应该保留在数据库中.

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

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

  1. encodeBase64(Byte[] barray)
  2. decodeBase64(String str)

它完美无缺,解决了我的问题.但它将55个字符串转换为仅6个字符串.

所以我想知道是否存在这些算法编码2个字符串的情况,这些字符串非常大并且只有1个字符不匹配(例如)到相同的编码字节数组中.

Base64不太了解课程,但如果有人能帮助我,那将非常有帮助.

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

提前致谢.

joh*_*tok 12

不是很有效率.

此外,使用sun.misc类提供了一个非便携式应用程序.

查看MiGBase64的以下性能比较:

在此输入图像描述


所以我想知道是否存在这些算法编码2个字符串的情况,这些字符串非常大并且只有1个字符不匹配(例如)到相同的编码字节数组中.

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

Base64( UTF8( "test" ) ) => "dGVzdA=="
Base64( UTF16( "test" ) ) => "/v8AdABlAHMAdA=="
Run Code Online (Sandbox Code Playgroud)

解决方案1

使用无损压缩

GZip( UTF8( "test" ) )
Run Code Online (Sandbox Code Playgroud)

在这里,您将字符串转换为字节数组,并使用无损压缩来减少必须存储的字节数.您可以改变字符编码和压缩算法,以减少字节数,具体取决于您将要存储的字符串(即,如果它主要是ASCII,那么UTF-8可能是最好的.

优点:无冲突,恢复原始字符串的能力
缺点:存储值所需的字节数是可变的; 存储值所需的字节数较大

解决方案2

使用散列算法

SHA256( UTF8( "test" ) )
Run Code Online (Sandbox Code Playgroud)

在这里,您将使用散列函数将字符串转换为固定长度的字节集.散列是单向的,并且本质上可以发生碰撞.但是,根据您希望处理的字符串和字符串数量,您可以选择哈希函数以最小化冲突的可能性

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