对于长度不超过255个字符的字符串是否有一种非常简单的压缩技术(是的,我正在压缩URLs)?
我并不关心压缩的强度 - 我正在寻找性能非常好且能够快速实现的东西。我想要一些比SharpZipLib更简单的东西:可以通过几种简短方法实现的东西。
答案 0 :(得分:20)
我认为这里的关键问题是“为什么要压缩网址?”
尝试缩短地址栏的长网址?
您最好将原始URL存储在某处(数据库,文本文件...)以及非域部分的哈希码(MD5很好)。然后,您可以拥有一个简单的页面(或者如果您感觉华而不实,可以使用一些HTTPModule)来读取MD5并查找真实的URL。这就是TinyURL和其他人的工作方式。
例如:
http://mydomain.com/folder1/folder2/page1.aspx
可以缩短为:
http://mydomain.com/2d4f1c8a
使用压缩库不起作用。该字符串将被压缩为更短的二进制表示形式,但将其转换回需要作为URL的一部分有效的字符串(例如Base64)将抵消从压缩中获得的任何好处。
在内存或磁盘上存储大量网址?
使用System.IO.Compression中的内置压缩库或简单且非常好的ZLib库。由于您将存储二进制数据,因此压缩输出将保持原样。您需要解压缩才能将其用作URL。
答案 1 :(得分:12)
正如the accepted answer中所建议的,使用数据压缩不能缩短已经相当短的URL路径。
DotNetZip有一个DeflateStream类,它暴露静态(在VB中共享)CompressString方法。这是使用DEFLATE(RFC 1951)压缩字符串的单行方式。 DEFLATE实现与System.IO.Compression.DeflateStream完全兼容,但DotNetZip压缩效果更好。以下是您可以使用它的方法:
string[] orig = {
"folder1/folder2/page1.aspx",
"folderBB/folderAA/page2.aspx",
};
public void Run()
{
foreach (string s in orig)
{
System.Console.WriteLine("original : {0}", s);
byte[] compressed = DeflateStream.CompressString(s);
System.Console.WriteLine("compressed : {0}", ByteArrayToHexString(compressed));
string uncompressed = DeflateStream.UncompressString(compressed);
System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
}
}
使用该代码,这是我的测试结果:
original : folder1/folder2/page1.aspx
compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx
original : folderBB/folderAA/page2.aspx
compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
因此,您可以看到“压缩”字节数组(以十六进制表示)比原始字节长,大约是2倍。原因是十六进制字节实际上是2个ASCII字符。
你可以通过使用base-62而不是base-16(hex)来代表数字来弥补这一点。在这种情况下,a-z和A-Z也是数字,给你0-9(10)+ a-z(+26)+ A-Z(+26)=总数的62。这将大大缩短产量。我没试过。爱好。
修改强>
好的,我测试了Base-62编码器。它将十六进制字符串缩短了大约一半。我认为它会降低到25%(62/16 = ~4)但我认为我正在失去一些离散化的东西。在我的测试中,生成的base-62编码字符串与原始URL的长度大致相同。所以,不,使用压缩然后base-62编码仍然不是一个好方法。你真的想要一个哈希值。
答案 2 :(得分:3)
我建议查看System.IO.Compression Namespace。 an article on CodeProject可能会有所帮助。
答案 3 :(得分:1)
你的目标是什么?
答案 4 :(得分:0)
我首先尝试使用现有的(免费或开源)zip库,例如: http://www.icsharpcode.net/OpenSource/SharpZipLib/
Zip应该适用于文本字符串,我不确定是否值得实施你自己的压缩算法....
答案 5 :(得分:0)
您是否尝试过使用gzip?
不知道它是否可以有效地使用这么短的琴弦,但我想说它可能是你最好的选择。
答案 6 :(得分:0)
开源库SharpZipLib易于使用,并为您提供压缩工具
答案 7 :(得分:0)
您可以直接使用deflate算法,不需要任何标题校验和或页脚,如此问题中所述:Python: Inflate and Deflate implementations
在我的测试中,它将4100个字符的URL减少到1270个base64个字符,使其符合IE 2000的限制。
这是一个4000-character URL的例子,由于applet可以存在于任何服务器上,因此无法用哈希表解决。
答案 8 :(得分:0)
我刚刚创建了一个针对URL的压缩方案,并实现了大约50%的压缩(与原始URL文本的base64表示相比)。
请参阅make less $$