Решение отвратительное. Это уже что-то из серии про архиватор Бабушкина.
Ну разумеется, коллизии будут.
Лучше оставить MD5 (у которого вероятность коллизий вполне в пределех допустимого), но перевести его из неэффективного base16 в более короткую форму. Base64 вполне подойдёт, поскольку кодировщик есть в пхп из коробки. Вот только оба не буквенно-цифровых символа там не подходят для передачи через урл - лучше их заменить:
$base64 = substr(strtr(base64_encode(hex2bin($md5)),'+/',"_-"),0,-2);
Итого экономим 10 символов из 32-х. Конечно, 22 хуже чем 8, но тут надо выбирать - или достаточная длина, или коллизии и отсутствие безопасности вообще.