Wie generieren Sie zufällige 64-bit-Wert als dezimal-string in PHP
Oauth erfordert eine zufällige 64-bit -, vorzeichenlose Zahl kodiert als ASCII-string im dezimal-format. Könnt Ihr mir helfen, erreichen dies mit php?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie zwei 32-bit-zahlen, die vier 16-bit-zahlen, etc.
PHP rand() und und mt_rand() aber wie viele zufällige bits, die Sie liefern, ist nicht von der Norm vorgegebenen (obwohl Sie abgefragt werden können mit Hilfe von getrandmax() und mt_getrandmax(), beziehungsweise.)
Also Ihre
sichersteeinfachste Wette wäre Generierung von 64 zufälligen bits und setzen Sie eins nach dem anderen.Als für das arbeiten mit 64-bit-Ganzzahlen, würde ich empfehlen die GMP Bibliothek, da Sie eine gute Palette von Funktionen, um Ihnen zu helfen.
Könnten Sie eine Nummer, rufen Sie 64 gmp_setbit()s auf es mit den aufeinander folgenden Positionen, die dann konvertiert es in einen string mit gmp_strval().
Das war ein wirklich Interessantes problem (wie die dezimale Darstellung eines beliebigen Länge Zufallszahl in PHP, mit keine optionalen Erweiterungen). Hier ist die Lösung:
Schritt 1: beliebige Länge Zufallszahl
Zu diesem Zeitpunkt aufrufen
random_bits(2048)
geben Sie 2048 random bit als hex-kodierter string, kein problem.Schritt 2: beliebige Präzision base-Konvertierung
Mathe ist schwer, also hier ist der code:
Diese Funktion funktioniert wie beworben, zum Beispiel versuchen
base_convert_arbitrary('ffffffffffffffff', 16, 10) == '18446744073709551615'
undbase_convert_arbitrary('10000000000000000', 16, 10) == '18446744073709551616'
.Setzen Sie zusammen
count_bits
nicht in der Lage sein, um mit zahlen, die größer als PHP_INT_MAX.count_bits
ist in der Tat begrenzt, aber als wir 're gehen, es zu benutzen, Messen Sie den return-Wertmt_getrandmax
es ist ausreichend für den job.mt_getrandmax
Regel scheint zu sein 2^31-1 auch auf 64-bit-Plattformen.nab = convert(n, a, b)
kann es sein, dassn !== convert(nab, b, a)
. Seien Sie vorsichtig.base_convert_arbitrary
. Aber warum alle die Alphabete? Nicht$value = $value * $fromBase + $nibbles[$i];
sicherzustellen, dass die operation kann nur gültig sein, für die Basis 2 bis 16?strpos
nichtsubstr
. Ich bin immer noch verwirrt, aber auf($value >= $toBase) { $nibbles[$newlen++] = (int)($value / $toBase); $value %= $toBase; }
, was genau ist hier passiert? Kommentare wären sehr willkommen.Bauen Sie eine OAuth-adapter selbst? Wenn ja, möchten Sie vielleicht zu überdenken. Es gibt viele gute OAuth-Bibliotheken, inklusive einer von PECL, eine in der BIRNE, zum anderen aus dem Zend Framework, und dieser andere gehostet auf Google Code. Ich habe mit den ersten drei, und Sie sind alle ziemlich anständig.
Wenn Sie wirklich wollen, dies selbst zu tun, können Sie Gesicht ein Problem. PHP-denken kann nicht in 64-bit-zahlen, es sei denn, es kompiliert auf einem 64-bit-Plattform oder Sie haben ein fortgeschrittenes Mathematik-Erweiterung installiert. Dies wird um Vorlage eines 64-bit-Zahl als dezimal - sehr schwierig. Es sieht aus wie viele der Bibliotheken, die ich weiter oben verlinkt völlig ignorieren das format Anforderung und einfach Arbeit mit einem raw-MD5-hash. Hier ist der code von der ZF-adapter:
Sie Aussehen, Sie sind immer Weg mit diesem ohne Fragen der Interoperabilität.