It'd be much simpler to read if that was a constraint of a separate computeHash overload.