code: @Override
  	public String getCacheKey(String name, Tree params, String... keys) {
  		if (params == null) {
  			return name;
  		}
  		StringBuilder buffer = new StringBuilder(128);
  		serializeKey(buffer, params, keys);
  		String serializedParams = buffer.toString();
  		int paramsLength = serializedParams.length();
  		if (maxParamsLength < 44 || paramsLength <= maxParamsLength) {
  
  			// Key = action name : serialized key
  			return name + ':' + serializedParams;
  		}
  
  		// Length of unhashed part (begining of the serialized params)
  		int prefixLength = maxParamsLength - 44;
  
  		// Create SHA-256 hash from the entire key
  		byte[] bytes = serializedParams.getBytes(StandardCharsets.UTF_8);
  		MessageDigest hasher = hashers.poll();
  		if (hasher == null) {
  			try {
  				hasher = MessageDigest.getInstance("SHA-256");
  			} catch (Exception cause) {
  				logger.warn("Unable to get SHA-256 hasher!", cause);
  				return name + ':' + serializedParams;
  			}
  		}
  		bytes = hasher.digest(bytes);
  		hashers.add(hasher);
  
  		// Concatenate key and the 44 character long hash
  		String base64 = BASE64.encode(bytes);
  		if (prefixLength < 1) {
  
  			// Fully hashed key = action name : hash code
  			return name + ':' + base64;
  		}
  
  		// Partly hashed key = action name : beginig of the prefix + hash code
  		return name + ':' + serializedParams.substring(0, prefixLength) + base64;
  	}
docs: Creates a cacher-specific key by name and params. Concatenates the name
  and params.
  
  @param name
  action name
  @param params
  input (JSON) structure
  @param keys
  keys in the "params" structure (optional)
  
  @return generated cache key String