gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:03 27 4
gpt4 key购买 nike

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

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

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

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

它工作得很好,解决了我的问题。但它将 55 个字符的字符串转换为 6 个字符的字符串。

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

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

如果您能提出任何其他算法,使大字符串变短固定长度并解决我的目的,我将很乐意使用它。

提前致谢。

最佳答案

效率不高。

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

查看来自 MiGBase64 的以下性能比较:

enter image description here


So I wonder if there is any case where these algorithm encodes 2 Strings which are very large and have only 1 char mismatch (for example) into same encoded byte arrays.

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 可能是最好的。

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

解决方案 2

使用哈希算法

SHA256( UTF8( "test" ) )

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com