真正简单的短串压缩

时间:2009-07-28 08:41:34

标签: c# string compression short

对于长度不超过255个字符的字符串是否有一种非常简单的压缩技术(是的,我正在压缩URLs)?

我并不关心压缩的强度 - 我正在寻找性能非常好且能够快速实现的东西。我想要一些比SharpZipLib更简单的东西:可以通过几种简短方法实现的东西。

9 个答案:

答案 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 Namespacean 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 $$