23

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

我不关心压缩的强度——我正在寻找性能非常好并且可以快速实施的东西。我想要比SharpZipLib更简单的东西:可以用几个简短的方法来实现。

4

9 回答 9

21

我认为这里的关键问题是“为什么要压缩 URL?

试图缩短地址栏的长网址?

您最好将原始 URL 存储在某个地方(数据库、文本文件...)以及非域部分的哈希码(MD5 很好)。然后,您可以有一个简单的页面(或者一些 HTTPModule,如果您觉得花哨的话)来读取 MD5 并查找真实的 URL。这就是 TinyURL 和其他人的工作方式。

例如:

http://mydomain.com/folder1/folder2/page1.aspx

可以短接为:

http://mydomain.com/2d4f1c8a

为此使用压缩库是行不通的。该字符串将被压缩为更短的二进制表示,但是将其转换回需要作为 URL 的一部分有效的字符串(例如 Base64)将抵消您从压缩中获得的任何好处。

在内存或磁盘上存储大量 URL?

使用 System.IO.Compression 中的内置压缩库或简单且非常好的 ZLib 库。由于您将存储二进制数据,因此压缩输出将按原样进行。您需要解压缩它才能将其用作 URL。

于 2009-07-28T09:04:57.770 回答
12

正如接受的答案中所建议的那样,使用数据压缩无法缩短已经相当短的 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(十六进制)来表示数字,从而在一定程度上弥补这一点。在这种情况下 az 和 AZ 也是数字,给你 0-9 (10) + az (+26) + AZ (+26) = 62 个数字。这将大大缩短输出。我没试过。然而。


编辑
好的,我测试了 Base-62 编码器。它将十六进制字符串缩短了大约一半。我认为它会减少到 25% (62/16 =~ 4) 但我认为我在离散化中失去了一些东西。在我的测试中,生成的 base-62 编码字符串与原始 URL 的长度大致相同。所以,不,使用压缩然后 base-62 编码仍然不是一个好方法。你真的想要一个哈希值。

于 2010-01-29T11:43:54.923 回答
3

我建议查看System.IO.Compression Namespace。CodeProject 上有一篇文章可能会有所帮助。

于 2009-07-28T08:50:14.120 回答
3

我刚刚创建了一个以 URL 为目标的压缩方案,并实现了大约 50% 的压缩(与原始 URL 文本的 base64 表示相比)。

http://blog.alivate.com.au/packed-url/


如果一家大型科技公司的某个人正确地构建了它并将其发布以供所有人使用,那就太好了。谷歌支持协议缓冲区。这个工具可以为像谷歌这样的人节省大量的磁盘空间,同时仍然可以扫描。或者也许是伟大的船长本人?https://twitter.com/capnproto

Technically, I would call this a binary (bitwise) serialisation scheme for the data that underlies a URL. Treat the URL as text-representation of conceptual data, then serialize that conceptual data model with a specialised serializer. The outcome is a more compressed version of the original of course. This is very different to how a general-purpose compression algorithm works.

于 2018-06-07T23:52:20.603 回答
1

你的目标是什么?

于 2009-07-28T08:49:14.900 回答
1

您可以直接使用 deflate 算法,无需任何页眉校验和或页脚,如以下问题所述:Python: Inflate and Deflate implementations

在我的测试中,这会将 4100 个字符的 URL 减少到 1270 个 base64 字符,使其适合 IE 的 2000 限制。

这是一个4000 字符 URL的示例,它无法用哈希表解决,因为小程序可以存在于任何服务器上。

于 2010-10-20T16:58:23.403 回答
0

我将从尝试现有(免费或开源)zip 库之一开始,例如http://www.icsharpcode.net/OpenSource/SharpZipLib/

Zip 应该适用于文本字符串,我不确定是否值得你自己实施压缩算法......

于 2009-07-28T08:49:37.710 回答
0

您是否尝试过仅使用gzip

不知道它是否能有效地处理这么短的字符串,但我想说它可能是你最好的选择。

于 2009-07-28T08:50:36.240 回答
0

开源库SharpZipLib易于使用,将为您提供压缩工具

于 2009-07-28T08:50:36.927 回答