cbp*_*cbp 22 c# compression string short
是否有一个非常简单的压缩技术,用于长度不超过255个字符的字符串(是的,我正在压缩URL)?
我并不关心压缩的强度 - 我正在寻找一些性能非常好且能够快速实现的东西.我想要一些比SharpZipLib更简单的东西:可以用几个简短的方法实现的东西.
bad*_*d99 20
我认为这里的关键问题是" 你为什么要压缩URL? "
试图缩短地址栏的长网址?
您最好将原始URL存储在某处(数据库,文本文件...)以及非域部分的哈希码(MD5很好).然后,您可以拥有一个简单的页面(或者如果您感觉华而不实,可以使用一些HTTPModule)来读取MD5并查找真实的URL.这就是TinyURL和其他人的工作方式.
例如:
http://mydomain.com/folder1/folder2/page1.aspx
Run Code Online (Sandbox Code Playgroud)
可以缩写为:
http://mydomain.com/2d4f1c8a
Run Code Online (Sandbox Code Playgroud)
为此使用压缩库将不起作用.该字符串将被压缩为更短的二进制表示形式,但将其转换回需要作为URL的一部分有效的字符串(例如Base64)将否定您从压缩中获得的任何好处.
在内存或磁盘上存储大量URL?
使用System.IO.Compression中的内置压缩库或简单且非常好的ZLib库.由于您将存储二进制数据,因此压缩输出将保持原样.您需要解压缩才能将其用作URL.
Che*_*eso 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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用该代码,这是我的测试结果:
original : folder1/folder2/page1.aspx
compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx
original : folderBB/folderAA/page2.aspx
compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到"压缩"字节数组,以十六进制表示,比原始字节长,大约是2倍.原因是十六进制字节实际上是2个ASCII字符.
你可以通过使用base-62而不是base-16(hex)来代表数字来弥补这一点.在这种情况下,az和AZ也是数字,给你0-9(10)+ az(+26)+ AZ(+26)=总数的62.这将大大缩短产量.我没试过.然而.
编辑
确定我测试了Base-62编码器.它将十六进制字符串缩短了大约一半.我认为它会降低到25%(62/16 = ~4)但我认为我正在失去一些离散化的东西.在我的测试中,生成的base-62编码字符串与原始URL的长度大致相同.所以,不,使用压缩然后base-62编码仍然不是一个好方法.你真的想要一个哈希值.