MemoryCache
实际上是相当复杂的(引用Reflector的副本,如果你还没有看看)。它有几件事情是非常重要的,其中最主要的是近似缓存对象使用的内存大小。
从表现上看,您将与竞争更多更重要的影响比按键的一个关键。性能是可以接受的,但是关键管理是这个过程中不重要的一部分。
您可以通过在Dictionary
与MemoryCache
之间执行100K +添加操作来查看此差异。
这里有一个小的十六进制算法,你可以使用你的字节键,我已经调整了尽可能快。 BCL还包含基本的16个功能(我不知道什么时候编写这些代码,而且我保留了它,因为它更简单/更快)。
正如在评论中指出的,将byte[]
转换为十六进制可能甚至不需要满足所述的要求,除非该密钥将用于别处。
public unsafe sealed class Hex
{
private static readonly char[] _hexRange = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/// <summary>
/// Converts a byte array into a string of base-16 values.
/// </summary>
/// <param name="value">Value to convert.</param>
/// <returns>Base-16 encoded string.</returns>
public static string ToHexString(byte[] value)
{
char* buffer = stackalloc char[(value.Length * 2) + 1]; // +1 for null terminator
char* start = buffer;
for(int i = 0; i < value.Length; i++)
{
*buffer++ = _hexRange[value[i]/16];
*buffer++ = _hexRange[value[i] % 16];
}
return new string(start);
}
}
嗯,使用Convert.ToBase64String并继续你的生活。 –
我有同样的问题,在我的情况下,它稍差,因为我想要一个真正通用的MemoryCache,可以有任何类型的密钥。 在我的情况下创建了一个使用MemoryCache的类,但它也必须提供密钥转换方法。 从来没有像我想要的那么好,但我不想尝试复制MemoryCache在引擎盖下做的一些复杂的事情。 在我已经完成的新应用程序中,我们只使用字典实现了定时缓存并覆盖了Get和Set方法。这样你就可以使用任何东西作为一个键。 –