You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效缩短由多价格码生成的超长缓存键并保证唯一性?

缩短缓存键且保证唯一性的高效方案

核心思路:哈希算法

利用密码学哈希函数将长字符串转换为固定长度的短字符串,既能大幅压缩缓存键长度,又能保证极高的唯一性(业务场景下可认为无碰撞)。

  • 推荐实现(SHA256):
    SHA256生成64位十六进制字符串(固定长度),安全性和唯一性都有保障,性能也足够应对缓存场景。

    代码示例:

    using System.Security.Cryptography;
    using System.Text;
    
    // 拼接原始参数字符串
    var originalKey = string.Join("_", priceCodeList);
    // 生成SHA256哈希
    using var sha256 = SHA256.Create();
    var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(originalKey));
    // 转换为无分隔符的十六进制字符串
    var hashString = BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant();
    // 拼接前缀生成最终缓存键
    var cacheKey = $"SalesPrice_{hashString}";
    
  • 轻量替代(MD5):
    如果对性能要求极高,MD5生成32位十六进制字符串,速度更快。虽然理论上存在碰撞可能,但在业务缓存场景下几乎不会发生。

    代码示例:

    using System.Security.Cryptography;
    using System.Text;
    
    var originalKey = string.Join("_", priceCodeList);
    using var md5 = MD5.Create();
    var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(originalKey));
    var hashString = BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant();
    var cacheKey = $"SalesPrice_{hashString}";
    

关键注意事项

  1. 编码一致性:必须固定使用同一种编码(如UTF8)转换字符串为字节数组,避免因编码差异导致相同输入生成不同哈希。
  2. 参数顺序敏感性:如果Web API对priceCodeList的顺序敏感(不同顺序的相同参数返回不同结果),不要对列表排序;若顺序不影响结果,可先排序再生成哈希,减少重复缓存键(比如[1,2]和[2,1]会生成同一个键)。
  3. 极端碰撞预防:若担心极小概率的哈希碰撞,可在哈希后拼接原始字符串的长度,进一步降低风险:$"SalesPrice_{originalKey.Length}_{hashString}"。

内容的提问来源于stack exchange,提问作者Serhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:22