recursive hash