说我想将ID存储在cookie中:
123,1232,3443,2343,2344422,2342
看到一个cookie有4kb限制(或其他),加密该值会以某种方式允许更多存储空间吗?
如果是这样,哪种加密最好? (并不是真的担心安全性,只想用更少的足迹存储更多)
答案 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;
}