requires hash