Para gerar uma string única, basta utilizar uniqid(), não?
sabendo que o upload foi feito, vc pode utilizar (considerando que "userfile" é o nome do seu campo):
move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"]) ;
mas isso pode gerar exatamente o que vc mencionou, nomes de arquivos duplicados, então vc pode utilizar o uniqid():
move_uploaded_file($_FILES["userfile"]["tmp_name"], uniqid()) ;
mas ai ainda tem um problema que é a extensão do arquivo, ou seja, se é png, seria bacana você manter esta extensão no arquivo e assim por diante. então faça uma validação para os tipos de arquivo que vc aceita como upload, tipo:
switch($_FILES["userfile"]["type"])
{
case 'image/png':
$extensao = ".png";
break;
case 'image/gif':
$extensao = ".gif"
break;
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
$extensao = ".jpg";
break;
default:
die('Tipo de arquivo inválido');
}
move_uploaded_file($_FILES["userfile"]["tmp_name"], uniqid() . $extensao);
Se você tiver familiaridade com orientação a objetos, pode utilizar a library sugerida no grupo PHPMG para manipulação de imagens:
Se não procure um tutorial para gerar imagens e consulte a documentação da biblioteca GD que é a mais fácil mesmo. Veja alguns tutoriais que podem te ajudar ou inspirar a criar o seu gerador de "carteirinhas":