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.
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 Mozilla Firefox 2.0.0.14 em Windows XP
ah alteraste antes deste “shot”
A usar Mozilla Firefox 2.0.0.14 em Windows XP
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 Safari 525.18 em Mac OS X
@Pedro Cardoso: Sim, é verdade, mas o facto é que faz falhar do lado do Windows. Não tenho explicação.
A usar Mozilla Firefox 3.0 em Windows Vista