getCacheKeyFromPath static method

String getCacheKeyFromPath(
  1. String? path,
  2. Map<String, dynamic> params,
  3. List<String> ignoreKeys
)

生成缓存键

使用 SHA-256 哈希生成固定长度的缓存键,避免键过长和碰撞风险。 格式:前16字符哈希值,保证唯一性的同时节省存储空间。

Implementation

static String getCacheKeyFromPath(String? path, Map<String, dynamic> params, List<String> ignoreKeys) {
  if (TextUtil.isEmpty(path)) {
    throw Exception("请求地址不能为空!");
  }

  final buffer = StringBuffer(path!);

  if (params.isNotEmpty) {
    final tempParams = Map<String, dynamic>.from(params);
    tempParams.removeWhere((key, value) => ignoreKeys.contains(key));

    if (tempParams.isNotEmpty) {
      buffer.write('?');
      final sortedKeys = tempParams.keys.toList()..sort();
      for (var i = 0; i < sortedKeys.length; i++) {
        if (i > 0) buffer.write('&');
        final key = sortedKeys[i];
        buffer.write(key);
        buffer.write('=');
        buffer.write(tempParams[key]);
      }
    }
  }

  final rawKey = buffer.toString();

  // 如果键长度小于 64,直接使用原始键(短键不需要哈希)
  if (rawKey.length <= 64) {
    return rawKey;
  }

  // 长键使用 SHA-256 哈希,取前 32 字符作为缓存键
  final bytes = utf8.encode(rawKey);
  final digest = sha256.convert(bytes);
  return digest.toString().substring(0, 32);
}