Hash table based implementation of the cache, which allows to use weak or soft references for keys and values.