Block is used to localize the variable cache as used in the function g when called from the function f. In f the cache symbol to use is passed in as the second parameter z.f[a_, z_] := Block[{cache = z}, g[a]];g[a_] := (Print["hash" -> Hash[cache]]; cache[1] = a; cache[1]);

Everything works as expected...Hash[z]2065959314 (your number may be different)

Calling f...f[1, z]hash->2065959314 (same)1

The symbol z now has a single downvalue...DownValues[z]{HoldPattern[z[1]] :> 1}

However what if I actually want to use the symbol cache as the cache symbol...

Hash[cache]1028301578 (your number may be different)

Calling f...f[1, cache]hash->1028301578 (same)1

Nothing stored in the cache this time?DownValues[cache]{}

My theory is that Block[{cache = cache},... effectively localizes cache to a local temporary variable but that doesn't explain why I see the right Hash for the symbol inside g.