有没有一种适用于长度不超过255个字符的字符串的非常简单的压缩技术(是的,我正在压缩URLs)?
我不关心压缩的强度 - 我正在寻找一些表现非常好且实现快速的东西。我想要比SharpZipLib更简单的东西:一些可以用几个简短的方法实现的东西。
有没有一种适用于长度不超过255个字符的字符串的非常简单的压缩技术(是的,我正在压缩URLs)?
我不关心压缩的强度 - 我正在寻找一些表现非常好且实现快速的东西。我想要比SharpZipLib更简单的东西:一些可以用几个简短的方法实现的东西。
我认为这里的关键问题是:“你为什么想要压缩URL?”
是为了缩短地址栏上的长URL吗?
你最好将原始URL存储在某个地方(数据库、文本文件等),并将非域部分的哈希码(MD5可行)与其一起存储。然后可以有一个简单的页面(或者如果你感觉兴奋,可以使用一些HTTP模块)来读取MD5并查找真正的URL。这就是TinyURL和其他类似服务的工作原理。
例如:
http://mydomain.com/folder1/folder2/page1.aspx
可以缩短为:
http://mydomain.com/2d4f1c8a
使用压缩库来处理这个问题是行不通的。字符串将被压缩为较短的二进制表示形式,但将其转换回需要作为URL一部分有效的字符串(例如Base64)将抵消您从压缩中获得的任何收益。
需要在内存或磁盘中存储大量URL吗?
请使用System.IO.Compression中内置的压缩库或简单且表现非常好的ZLib库进行压缩。由于您将存储二进制数据,因此压缩输出本身就已经足够。您需要解压缩它以将其用作URL。
正如被接受的回答建议的那样,使用数据压缩并不能缩短已经相当短的 URL 路径。
DotNetZip 有一个 DeflateStream 类,它公开了一个静态的(在 VB 中为 Shared 的)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
因此,您可以看到“压缩”字节数组在十六进制表示时比原始数组长约两倍。原因是十六进制字节实际上是两个 ASCII 字符。我刚刚创建了一个压缩方案,针对URL并实现了约50%的压缩(与原始URL文本的base64表示相比)。
请参见http://blog.alivate.com.au/packed-url/
如果有一家大型科技公司能够将其完善并发布供所有人使用,那将是非常好的。谷歌推出了Protocol Buffers。这个工具可以为像谷歌这样的公司节省很多磁盘空间,同时仍然可以进行扫描。或者也许是伟大的船长自己?https://twitter.com/capnproto
从技术上讲,我会称之为数据模型的二进制(位)序列化方案,该数据模型是URL底层数据的文本表示形式,然后使用专门的序列化器对该概念数据模型进行序列化。当然,结果是原始版本的更压缩版本。这与通用压缩算法的工作方式非常不同。
您可以直接使用deflate算法,不需要任何头部校验和尾部,如此问题中所述:Python:Inflate和Deflate实现。
在我的测试中,这将一个4100个字符的URL削减到了1270个base64字符,使其适合IE的2000限制。
And here's an example of a 4000-character URL, which can't be solved with a hashtable since the applet can exist on any server.
你的目标是什么?
我建议您先尝试使用现有的(免费或开源)zip库之一,例如http://www.icsharpcode.net/OpenSource/SharpZipLib/。
对于文本字符串,Zip应该可以很好地工作,我不确定是否值得自己实现压缩算法....