I can't help but wonder if nearly all of this class' code should actually be in a superclass which this and the MD5 one extend, the only concrete implementation they have to fill in being that their no-argument constructor passes a `HashFunction` instance to the superclass' constructor to fill in for the private final. Then, we get full implementations, nothing unsupported, for near-free, of any of the hashes offered by Guava.