真正简单的短串压缩

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

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

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

试图缩短地址栏的长url?

您最好将原始URL存储在某处(数据库,文本文件…)以及非域部分的哈希码(MD5很好)。 然后,您可以拥有一个简单的页面(如果您感觉华而不实,可以使用一些HTTPModule)来读取MD5并查找真实的URL。 这就是TinyURL和其他人的工作方式。

例如:

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

可以缩写为:

 http://mydomain.com/2d4f1c8a 

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

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

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

正如在接受的答案中所建议的那样,使用数据压缩不能缩短已经相当短的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 

因此,您可以看到“压缩”字节数组(以hex表示)比原始字节长,大约是2倍。 原因是hex字节实际上是2个ASCII字符。

你可以通过使用base-62而不是base-16(hex)来代表数字来弥补这一点。 在这种情况下,az和AZ也是数字,给你0-9(10)+ az(+26)+ AZ(+26)=总数的62。 这会大大缩短产量。 我没试过。 然而。


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

我建议查看System.IO.Compression命名空间 。 有一篇关于CodeProject的文章可能有所帮助。

你的目标是什么?

  • 一个较短的url? 尝试http://tinyurl.com/或http://is.gd/等url缩短程序
  • 储存空间? 查看System.IO.Compression。 (或SharpZipLib )

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

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

你尝试过使用gzip吗?

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

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

您可以直接使用deflate算法,不需要任何标头校验和或页脚,如此问题中所述: Python:Inflate和Deflate实现

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

这是一个4000字符的URL的例子,由于applet可以存在于任何服务器上,因此无法用哈希表解决。

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

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