Задачка о шифровании
Можно, конечно: md5($pass.$salt.$date) — и $date округлять до нужного вам интервала: месяц, день, час — смотря какой срок годности. Проверять можно текущий и предыдущий, чтобы не было засады. Работать будет правда с точностью ± выбранный интервал, но думаю, не страшно.
например, код можно формировать как-то так:
HEX(симметричный_шифр(array(сложный_хэш_пароля, дата_окончания_хеша, сложный_хеш_включающий_дату_и_хэш_пароля)))
Загляните на phpclasses, там есть готовые алгоритмы в обход mcrypt.
Дополнительно нужно учесть лимит get-запроса.

Есть лучше вариант: например, можно давать срок на три дня, код записывать как
md5($password . $salt . date('Y-m-d', strtotime('+3 days')))
после перехода клиента по ссылке проверять соответствие пришедшего кода коду, сгенерированному на следующие три дня.
Минусы, думаю, понятны.

Отбрасывая вариант сохранения в бд Вы лишаетесь возможности контролировать количество переходов по приведенной ссылке, плюс приходится формировать довольно сложный url.