use*_*851 51 java compression string zip
我使用GZIPOutputStream或ZIPOutputStream压缩一个String(我string.length()的小于20),但压缩结果比原始字符串长.
在某些网站上,我发现有些朋友说这是因为我原来的字符串太短,GZIPOutputStream可以用来压缩更长的字符串.
那么,有人可以给我一个压缩字符串的帮助吗?
我的功能如下:
String compress(String original) throws Exception {
}
Run Code Online (Sandbox Code Playgroud)
更新:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;
//ZipUtil
public class ZipUtil {
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return out.toString("ISO-8859-1");
}
public static void main(String[] args) throws IOException {
String string = "admin";
System.out.println("after compress:");
System.out.println(ZipUtil.compress(string));
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:

Jes*_*erE 39
压缩算法几乎总是具有某种形式的空间开销,这意味着它们仅在压缩数据时有效,该数据足够大以至于开销小于节省的空间量.
压缩一个只有20个字符长的字符串并不容易,但并不总是可行.如果你有重复,霍夫曼编码或简单的游程编码可能能够压缩,但可能不是很多.
创建String时,可以将其视为char的列表,这意味着对于String中的每个字符,您需要支持char的所有可能值.来自太阳博士
char:char数据类型是一个16位Unicode字符.它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含)).
如果你想要支持一组简化的字符,你可以编写一个简单的压缩算法,类似于binary-> decimal-> hex radix converstion.您从65,536(或目标系统支持的多个字符)到26(字母)/ 36(字母数字)等.
我曾经多次使用过这个技巧,例如将时间戳编码为文本(目标36 +,源10) - 只需确保你有足够的单元测试!
如果密码或多或少"随机",那么你运气不好,你将无法大幅减少尺寸.
但是:为什么需要压缩密码?也许你需要的不是压缩,而是某种哈希值?如果您只需要检查名称是否与给定密码匹配,则不需要保存密码,但可以保存密码的哈希值.要检查键入的密码是否与给定名称匹配,您可以采用相同的方式构建哈希值,并将其与保存的哈希值进行比较.由于散列(Object.hashCode())是一个int,您将能够以80个字节存储所有20个密码哈希值.
你的朋友是对的.gzip和ZIP都基于DEFLATE.这是一种通用算法,不适用于编码小字符串.
如果需要,可能的解决方案是自定义编码和解码HashMap<String, String>.这可以让您进行简单的一对一映射:
HashMap<String, String> toCompressed, toUncompressed;
String compressed = toCompressed.get(uncompressed);
// ...
String uncompressed = toUncompressed.get(compressed);
Run Code Online (Sandbox Code Playgroud)
显然,这需要设置,并且仅适用于少量字符串.
| 归档时间: |
|
| 查看次数: |
111196 次 |
| 最近记录: |