C# 加密一个逗号分隔的ID列表会使它变小,以适应cookie吗?

C# 加密一个逗号分隔的ID列表会使它变小,以适应cookie吗?,c#,encryption,cookies,compression,C#,Encryption,Cookies,Compression,假设我想将ID存储在cookie中: 1231232344323444222342 看到一个cookie有4kb的限制或其他什么,加密该值会允许更多的存储吗 如果是,哪种加密方式最好?不是真的担心安全性,只是想用更少的占用空间存储更多的数据。加密不一定会压缩,通常不会,而且任何压缩都可以不用加密 我建议您寻找一种简单的方法来高效地存储这样的简单数据。加密不一定会压缩,通常不会,而且您所做的任何压缩都可以在不加密的情况下完成 我建议您寻找一种简单的方法来高效地存储这样的简单数据。加密本身不会压缩数

假设我想将ID存储在cookie中:

1231232344323444222342

看到一个cookie有4kb的限制或其他什么,加密该值会允许更多的存储吗


如果是,哪种加密方式最好?不是真的担心安全性,只是想用更少的占用空间存储更多的数据。加密不一定会压缩,通常不会,而且任何压缩都可以不用加密


我建议您寻找一种简单的方法来高效地存储这样的简单数据。

加密不一定会压缩,通常不会,而且您所做的任何压缩都可以在不加密的情况下完成


我建议您寻找一种简单的方法来高效地存储这样的简单数据。

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


请注意,加密后无法对其进行有意义的压缩。加密会将其变成看似随机的数据,而不适于压缩。

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


请注意,加密后无法对其进行有意义的压缩。加密将其变成看似随机的数据,而不适合压缩。

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


如果只在cookie中存储一个密钥,通过一个简单的DB查询就可以找到超长的数字序列,这不是更容易吗?

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


如果只在cookie中存储一个密钥,通过简单的DB查询就可以找到超长的数字序列,这不是更容易吗?

如果您只对压缩数据感兴趣,那么可以使用.Net中的流压缩类

如果您只对压缩数据感兴趣,可以使用.Net中的流压缩类

您可以使用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;
    }

您可以尝试使用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;
    }

你要的是压缩,不是加密。你可以尝试哈夫曼编码,但在这里,每个字符似乎都是相同的,所以这对你没有多大好处。好奇你最终得到了什么解决方案?你在寻找压缩,而不是加密。你可以尝试哈夫曼编码,但在这里,每个字符似乎都有相同的可能性,所以这对你没有多大好处。好奇你最终得到了什么解决方案?