8
votes

Comment générer une valeur aléatoire de 64 bits comme une chaîne décimale dans PHP

OAuth nécessite un numéro aléatoire de 64 bits et non signé codé sous forme d'une chaîne ASCII en format décimal. Pouvez-vous m'aider à y parvenir avec PHP? Merci


0 commentaires

3 Réponses :


4
votes

Vous pouvez utiliser deux nombres 32 bits, quatre nombres 16 bits, etc.

php a rand () et et mt_rand () Mais combien de bits aléatoires ils fournissent n'est pas spécifié par la norme (bien qu'ils Peut être interrogé à l'aide de getRandmax () et mt_getrandmax () , respectivement.)

Donc, votre Safest Le pari le plus simple générerait 64 bits aléatoires et les définir un par un.

Quant à travailler avec des entiers de 64 bits, je vous recommande d'utiliser le GMP bibliothèque car il a une bonne gamme de fonctions pour vous aider.

Vous pouvez créer un numéro, appelez 64 GMP_Setbit () S sur celui-ci avec des positions successives, convertissez-la en une chaîne à l'aide de GMP_Strval ().


0 commentaires

2
votes

Vous construisez-vous vous-même un adaptateur OAuth? Si oui, vous voudrez peut-être reconsidérer. Il y a beaucoup de bonnes bibliothèques OAuth, y compris One de pecl , un en poire , un autre de la framework zend et cet autre organisé sur Google Code . J'ai travaillé avec les trois premiers, et ils sont tous assez décents.

Si vous vraiment em> veux faire cela vous-même, vous pouvez faire face à un problème. PHP ne peut pas penser en nombre de 64 bits à moins que cela ne soit compilé sur une plate-forme 64 bits ou une extension de mathématiques avancée installée. Cela va faire la présentation d'un nombre de 64 bits comme une décimale très em> difficile. Il ressemble à de nombreuses bibliothèques que j'ai liées ci-dessus ignorent complètement l'exigence de format em> et utilisez simplement avec un hachage de MD5 cru. Voici le code de l'adaptateur ZF: p>

/**
 * Generate nonce
 * 
 * @return string
 */
public function generateNonce()
{
    return md5(uniqid(rand(), true));
}


0 commentaires

28
votes

C'était un problème vraiment intéressant (comment créer la représentation décimale d'un nombre aléatoire arbitraire de longueur en PHP, sans prolongation optionnelle). Voici la solution:

Étape 1: nombre aléatoire de longueur arbitraire h2> xxx pré>

à ce stade, appelant aléatoire_bits (2048) code> vous donnera 2048 Bits aléatoires en tant que chaîne codée hexagonale, pas de problème. p>

Étape 2: conversion de base de précision arbitraire h2>

math est difficile, voici le code: P>

echo base_convert_arbitrary(random_bits(64), 16, 10);


6 commentaires

+1 pour l'esprit-soufflant de même pensant de le faire dans PHP. N'oubliez pas que comte_bits ne sera pas en mesure de traiter des chiffres plus grands que php_int_max.


@Chals: Merci pour le vote. Count_bits est en effet limité, mais comme nous ne serons que pour mesurer pour mesurer la valeur de retour de mt_getrandmax C'est adéquate pour le travail.


Très adéquat compte que mt_getrandmax semble généralement être 2 ^ 31-1 même sur des plates-formes 64 bits.


Juste FYI: Parfois, la resprésentation du nombre peut contenir des zéros de premier plan (c'est-à-dire le résultat de la fonction hachage ()) et cette fonction ne peut évidemment pas les restaurer après la conversion. Donc, si nab = convert (n, a, b) il peut s'agir de ce n! == convert (nab, b, a) . Fais attention.


Fonction intéressante base_convert_arbitraire . Mais pourquoi tous les alphabets? N'a-t-elle pas valeur $ = Valeur $ * $ fratesbase + $ Nibbles [$ I]; S'assurer que l'opération ne peut être valide que pour la base 2 à 16?


Intéressant, je viens de remarquer ce qu'est-ce que Nibbles a réellement est Stros pas substr . Je suis toujours confus cependant à ($ valeur> = $ tobase) {$ Nibbles [$ newlen ++] = (int) ($ valeur / $ tobase $); $ valeur% = $ tobase; } , qu'est-ce qui se passe exactement ici? Les commentaires seraient bien appréciés.