应该散列缓存键吗?

Should cache keys be hashed?

我正在使用 NCache 的现有系统上工作。它是一个分布式系统,对缓存的要求很高,所以毫无疑问缓存是正确答案,但是...

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

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

原来写代码的人走了,key为什么要缓存的知识都丢了。

任何人都可以建议哈希是否是正确的做法,或者是否应该将其删除。

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

NCache通过key来识别对象,认为key相等的对象是相等的。下面是来自维基百科的哈希函数的definition

A hash function is any function that can be used to map data of arbitrary size to data of fixed size.

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

NCache 不要求您散列键。 NCache 键只是一个字符串,对每个对象都是唯一的。相关摘录自NCache 4.6 Programmer’s Guide

NCache uses a “key” and “value” structure for objects. Every object must have a unique string key associated with it. Every key has an atomic occurrence in the cache whether it is local or clustered. Cached keys are case sensitive in nature, and if you try to add another key with same value, an OperationFailedException is thrown by the cache.

好的,你的问题是

  1. 我们应该在存储之前对密钥进行哈希处理吗?
  2. 如果你自己做散列,它会减慢速度吗

嗯,缓存 API 在 strings 上作为 keys 工作。在后台,NCache 自动根据这些键生成散列值,帮助它识别对象应该存储在哪里。我的意思是在哪个节点。

当您说您的应用程序在将其交给 NCahe 之前对密钥进行哈希处理时,这很简单,这是一个不必要的步骤。 NCache API 旨在解决您的头痛问题。

但是,如果这些哈希值是由于应用程序中的某些内部逻辑而生成的,那就另当别论了。请仔细检查。

不用说,如果你一次又一次地做某事,那么它肯定会降低性能。您提供的 Hash 字符串将再次用于生成另一个哈希值 (int)。