繁体   English   中英

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

[英]How efficient is the encoding/decoding algorithm of BASE64 class in Java?

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

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

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

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

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

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

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

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

提前致谢。

不是很有效率。

此外,使用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=="

解决方案1

使用无损压缩

GZip( UTF8( "test" ) )

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

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

解决方案2

使用散列算法

SHA256( UTF8( "test" ) )

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

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

我刚看到你的评论 - 看起来你实际上正在寻找压缩而不是像我最初想的那样散列。 虽然在这种情况下,你将无法获得任意输入的固定长度输出(考虑一下,无限数量的输入不能双射地映射到有限数量的输出),所以我希望这不是一个强烈的要求。

在任何情况下,您选择的压缩算法的性能将取决于输入文本的特征。 在没有进一步信息的情况下,DEFLATE压缩(由Zip输入流IIRC使用)是一个很好的通用算法,并且至少用作比较的基础。 但是,为了便于实现,您可以使用JDK中内置的Deflator类,它使用ZLib压缩。

如果输入字符串具有特定模式,则不同的压缩算法可能效率更高或更低。 在一个方面,如果您不打算通过任何其他进程读取压缩数据,那么使用哪一个并不重要 - 只要您可以自己压缩和解压缩,它对您的客户来说就是透明的。

这些其他问题可能会引起关注:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM