cache_key needs hashes of contents too