On relatively easy way is to use an encryption algorithm in counter mode. You keep a secret password, and a counter (the latter typically stored in the database). Each time you need a secret hash, you increment the counter, encrypt it with your password, and convert to text with something like Base64 encoding.
Unlike most of the others that have been mentioned, this one makes it pretty easy to keep track of where things can break down. Basically, there are two possibilities: 1) the encryption algorithm you're using gets broken, or 2) somebody gets to your secret password.
If you use a well-known, widely-used algorithm like AES, the first is a pretty minor concern. If somebody breaks it, they're going to be too busy grabbing a few billion from every bank on the planet to bother with your web site (unless there's some possibility of the web site in question dealing in so much money that they're going to bother with it). For most practical purposes, that leaves only one thing for you need to deal with: ensuring that your secret password stays secret.
That's pretty easy to handle. It's hard to keep things like credit card numbers secret because you need to make them available to the right people under the right circumstances. This is much easier, for the simple reason that there's never any reason to give it out to anybody.