需要有关压缩算法的想法

时间:2010-12-05 01:39:27

标签: compression

背景:我正在制作一个基于网络的头像生成系统,用户可以为自己的头像选择件(如身体,背景,眼睛,嘴巴,夹克,裤子等)然后从这些选择中生成图片。出于性能原因,我打算执行以下操作:从所选项目列表中生成包含其ID的文件名,并将该图片保存在此文件名下。然后,当请求图片时,网络服务器将直接提供。如果找不到图片,404处理程序将生成它。然后就是问题所在:

问题:我想用尽可能短的字符串压缩整数列表,只包含ASCII字符(可用于文件名和URL)。整数将是唯一的,大于0(0本身不在其中)。我希望它们中可能有大约20个并且它们不会超过200个,但这只是一个猜测(尽管如果他们超过500,我会感到惊讶)。订单并不重要。

你建议我做什么?

更新:哎呀,似乎我犯了一个根本性的错误。我想避免将每个生成的头像存储在数据库中,而是将所有必要的信息存储在文件名中。这样我希望避免不必要的DB使用,从而提高性能。然而今天让我感到震惊的是,人们可能想要更改他们的头像,并期望他们在任何地方都能更新它们。因此,文件名必须是常量。这只留下一个选项 - 我将不得不保存有关DB中头像的信息。然后我不妨使用GUID或其他随机字符串作为文件名。

感谢大家的帮助,并为虚惊。抱歉。 :(

3 个答案:

答案 0 :(得分:1)

将整数(每个项目9位)连接成一个字节数组,然后将结果编码为Base64

答案 1 :(得分:-1)

不清楚你在寻找什么; ASCII-85会起作用吗? http://en.wikipedia.org/wiki/Ascii85

同样,每个整数编码为UTF-8字符,字符组成一个字符串,然后在base-85中对结果字符串进行编码。

Doug Currie指出,ASCII-85不是一个好选择。任何不使用正斜杠的base64变体都是可取的。

答案 2 :(得分:-1)

一个选项可能是采用数字组合的md5来获得128位数。然后,您可以将其十六进制编码为32个字符的ASCII字符串,或者base64将其编码为22个字符的字符串。

您现在可以保证所有文件名都是固定大小,并且碰撞的几率非常小。

这为每个文件名节省了少量空间(128位而不是180位),它与值的数量和每个值的范围无关,所以即使你超过20项或最大值500它不会影响文件名长度。