function withHeaders(hash) {
            return ajaxHeaders ? hash + "+" + JSON.stringify(ajaxHeaders) : hash;
        }
The tile cache object is uniquely determined by this key and used to lookup
the image data in cache: keys should be different if images are different.

You can return falsey tile cache key, in which case the tile will
be created without invoking ImageJob --- but with data=null. Then,
you are responsible for manually creating the cache data. This is useful
particularly if you want to use empty TiledImage with client-side derived data
only. The default tile-cache key is then called "" - an empty string.

Note: default behaviour does not take into account post data.
@param {Number} level tile level it was fetched with
@param {Number} x x-coordinate in the pyramid level
@param {Number} y y-coordinate in the pyramid level
@param {String} url the tile was fetched with
@param {Object} ajaxHeaders the tile was fetched with
@param {*} postData data the tile was fetched with (type depends on getTilePostData(..) return type)
@return {?String} can return the cache key or null, in that case an empty cache is initialized
  without downloading any data for internal use: user has to define the cache contents manually, via
  the cache interface of this class.