Alguém me explica porque é que nesta função em PHP a correr num servidor Linux funciona perfeitamente do lado do IIS/ASP.NET/C# se usar o mt_rand e me dá um erro de Out Of Memory se usar o mt_srand ?
Não perdi muito tempo com o assunto, resolvi de outro modo, mas beats me!
Função PHP a correr em LAMP:
function create_pass() {
$length = 10;
$password="";
$possible="0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNO.... etc.";
srand((double)microtime()*1000000);
$i = 0;
while ($i < $length) {
$char = substr($possible, mt_rand(0, strlen($possible)-1, 1);
if (!strstr($password, $char)) {
$password .= $char;
$i++;
}
}
return $password;
} // create_pass()
Função ASP.NET/C# a correr em Windows. Esta função leva como parâmetro um URL para o ficheiro PHP no qual está a função acima:
public static string createNewUserData(string URL)
{
WebRequest request = WebRequest.Create(URL);
request.Proxy = null;
request.Credentials = CredentialCache.DefaultCredentials;
HTTPWebResponse response = (HTTPWebResponse)request.GetResponse();
Console.WriteLine (response.StatusDescription);
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();
return (responseFromSever);
} // createNewUserData
Presumo, não sei, que tenha a ver com o tamanho da resposta recebida na função em C# que talvez seja muito grande para guardar numa string.
Acho que com isto, tirava a dúvida:
StringBuilder responseFromServer = new StringBuilder(); responseFromServer.Append(reader.ReadToEnd()); GC.Collect();
Anyway… so much for interoperability.

901
308
106
2
2
1178
94
86
43
14
9
9
8
5
3
1
1 
while (i < $length)
isto foi copy&paste ou foi um typo? while($i<$length), nem sei se tem a ver com o caso, mas foi só uma observação
A usar
ah alteraste antes deste “shot”
A usar
O mt_srand não devolve um número aleatório, só inicializa a seed para o mt_rand().
Anyway, toma lá uma versão optimizada :)
function mkpass($len = 10) {
$possible = ‘abcdefABCDEF09…’;
$possible = str_split($possible);
shuffle($possible);
return implode(”", array_slice($possible, 0, $len));
}
A usar
@Pedro Cardoso: Sim, é verdade, mas o facto é que faz falhar do lado do Windows. Não tenho explicação.
A usar