Будет ли шифрование списка идентификаторов, разделенных запятыми, уменьшать его размер, чтобы поместиться в файл cookie? - PullRequest
1 голос
/ 07 декабря 2009

говорят, что я хочу сохранить идентификаторы в куки:

123,1232,3443,2343,2344422,2342

Видя, что cookie имеет ограничение 4 КБ (или что-то еще), шифрование значения позволит как-то увеличить объем памяти?

если да, то какое шифрование будет лучше? (не особо беспокоюсь о безопасности, просто хочу хранить больше с меньшими затратами)

Ответы [ 5 ]

5 голосов
/ 07 декабря 2009

С 4k байтами вы можете хранить 819 четырехзначных чисел. Вы уверены, что вам действительно нужно хранить больше?

Не проще ли было бы тогда просто сохранить в куки ключ, который приведет вас к вашей слишком длинной последовательности чисел простым запросом в БД?

2 голосов
/ 07 декабря 2009

Шифрование само по себе не сжимает данные. Вы можете посмотреть на сжатие, хотя. Имейте в виду, что различные значения будут сжиматься по-разному, поэтому, если вы приблизитесь к пределам того, что может быть сжато, вы можете обнаружить, что оно иногда не подходит. Если вам не хватает места, вы можете вместо этого искать другой подход.

Обратите внимание, что вы не можете сжимать его после шифрования. Шифрование превращает их в кажущиеся случайными данные, которые не поддаются сжатию.

0 голосов
/ 07 декабря 2009

Вы можете попробовать небольшое сжатие для каждого числа, используя реализацию VInt / Vlong. Сжатие будет зависеть от ваших данных. Чем выше идентификатор, тем ниже степень сжатия.

Вот реализация с использованием 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;
    }
0 голосов
/ 07 декабря 2009

Если вас интересует только сжатие данных, вы можете просто использовать классы сжатия потока в .Net. http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

0 голосов
/ 07 декабря 2009

Шифрование не обязательно сжимается (обычно это не происходит), и любое сжатие, которое вы делаете, может быть выполнено без шифрования.

Могу ли я предложить вам взглянуть на Буферы протокола для простого способа эффективного хранения простых данных, подобных этой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...