缓存键是否应该进行哈希处理?

时间:2017-01-10 11:35:08

标签: c# caching hash ncache

我正在使用NCache的现有系统。它是一个具有大缓存要求的分布式系统,因此毫无疑问缓存是正确的答案,但是...

出于某种原因,在现有代码中,所有缓存键在存储到缓存之前都会进行哈希处理。

我的论点是我们不应该对密钥进行散列,因为缓存库可能有一些超级优化的方式来存储它的字典并散列一切意味着如果我们这样做,我们实际上可能会减慢查找速度。

最初编写代码的人已离开,并且知道密钥被缓存的原因已经丢失。

任何人都可以建议散列是正确的做法,还是应该删除。

2 个答案:

答案 0 :(得分:1)

是否应该或不应该使用散列键取决于您的系统要求。

NCache通过它的键识别对象,并认为具有相等键的对象是相等的。下面是维基百科的哈希函数的definition

  

哈希函数是可用于映射数据的任何函数   任意大小的固定大小的数据。

如果停止哈希键,则缓存的行为可能会有所不同。例如,NCache认为相同的一些对象,现在NCache可能认为不相等。而不是一个缓存条目,你将得到两个。

NCache不要求您使用哈希键。 NCache键只是每个对象唯一的字符串。相关摘录自NCache 4.6 Programmer’s Guide

  

NCache对对象使用“键”和“值”结构。每个对象   必须有一个与之关联的唯一字符串键。每把钥匙都有   缓存中的原子出现,无论是本地还是群集。   缓存密钥本质上是区分大小写的,如果您尝试添加   另一个具有相同值的键,抛出一个OperationFailedException   缓存。

答案 1 :(得分:1)

好的,你的问题是

  1. 我们应该在存储之前散列密钥吗?
  2. 如果你自己做哈希,那么它会减慢任何事情吗
  3. 好吧,缓存API在strings上作为keys工作。在后台,NCache会自动生成针对这些键的哈希值,这有助于识别对象的存储位置。我的意思是在哪个节点。

    如果你说你的应用程序在交给NCahe之前使用哈希键,那么这是一个不必要的步骤。 NCache API旨在让您头疼。

    但是如果这些哈希值是由于你的应用程序中的某些内部逻辑而产生的那么另一种情况。请仔细检查。

    毋庸置疑,如果您一次又一次地做某事,那么肯定会有性能下降。您提供的哈希字符串将再次用于生成另一个哈希值(int)。