将加密逗号分隔的ID列表使其更小以适应cookie?

时间:2009-12-07 15:22:29

标签: c# encryption cookies compression

说我想将ID存储在cookie中:

123,1232,3443,2343,2344422,2342

看到一个cookie有4kb限制(或其他),加密该值会以某种方式允许更多存储空间吗?

如果是这样,哪种加密最好? (并不是真的担心安全性,只想用更少的足迹存储更多)

5 个答案:

答案 0 :(得分:5)

使用4k字节,可以存储819个四位数字。你确定你真的需要存储更多吗?

通过简单的数据库查询,只是在cookie中存储一个可以将您带到过长的数字序列中的密钥会不会更容易?

答案 1 :(得分:2)

加密本身不会压缩数据。你可以考虑压缩它。请记住,不同的值将按不同的量进行压缩,因此如果接近可压缩的值,您可能会发现它有时不适合。如果你的空间不足,你可能想要寻找不同的方法。

请注意,在加密后无法对其进行有意义的压缩。加密将其转换为看似随机的数据,并且不会导致压缩。

答案 2 :(得分:0)

加密不一定会压缩(通常不会),您可以在不加密的情况下完成任何压缩。

我是否可以建议您查看Protocol Buffers以便轻松有效地存储此类简单数据。

答案 3 :(得分:0)

如果您只对压缩数据感兴趣,可以使用.Net中的流压缩类。 http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

答案 4 :(得分:0)

您可以使用VInt / Vlong的实现对每个数字尝试小压缩。压缩会因您的数据而异。较高的id会降低压缩率。

这是使用vint的实现:

class CookieConverter
{
    private readonly Encoding _enc = Encoding.GetEncoding("iso-8859-1");
    public string PackCookieString(List<int> numbers)
    {
        MemoryStream memoryStream = new MemoryStream();
        foreach (int number in numbers)
        {
            byte[] bytes = GetVIntBytes(number);
            memoryStream.Write(bytes, 0, bytes.Length);
        }
        return _enc.GetString(memoryStream.ToArray());
    }

    public List<int> UnpackCookieString(string cookie)
    {
        byte[] bytes = _enc.GetBytes(cookie);
        List<int> numbers = new List<int>();
        int startIndex = 0;
        while (startIndex < bytes.Length)
        {
            numbers.Add(GetVInt(bytes, ref startIndex));
        }
        return numbers;
    }

    public byte[] GetVIntBytes(int value)
    {
        byte[] buffer = new byte[5];
        byte length = 0;
        while ((value & ~0x7F) != 0)
        {
            buffer[length] = (byte) ((value & 0x7f) | 0x80);
            value = value >> 7;
            length++;
        }
        buffer[length] = (byte) value;
        byte[] result = new byte[length+1];
        Array.Copy(buffer, 0, result, 0, result.Length);
        return result;
    }

    public int GetVInt(byte[] buffer, ref int startIndex)
    {
        byte b = buffer[startIndex];
        startIndex++;
        int i = b & 0x7F;
        for (int shift = 7; (b & 0x80) != 0; shift += 7)
        {
            b = buffer[startIndex];
            i |= (b & 0x7F) << shift;
            startIndex++;
        }
        return i;
    }