There is a lot of confusion between hash- and encryption algorithms; I would like to understand: 1. When do we use a hash algorithm and when do we use a cipher? 2. How difficult it is to reverse hash and encryption functions? 3. From the theoretical/mathematical perspective, what differentiates a hash or encryption algorithm?