1) I like the single-use token, but I'm interested in hearing others' perspectives.
2) Don't just hash. Use bcrypt, since it's probably got a library for you to use in your language (or database) of choice: http://codahale.com/how-to-safely-store-a-password/