2016-04-12 14 views
0

Ich versuche eine gute Möglichkeit zu finden, eine 32-stellige Hex-Sequenz zu erzeugen, die zufällig ist und ihre Zufälligkeit von einer großen Zahl wie 10 * 78 erhält.Zufällige 32 hexadezimale Ziffern in Python

Denn ich dies auch Python-Code gefunden:

ran = random.randrange(10**80) 
myhex = "%030x" % ran 

Dieses ein Hex-String 64 Ziffer erzeugt, aber manchmal ist das Ergebnis 63 oder sogar 61 Zeichen, und ich bin nicht sicher, warum? Ich brauche es jedes Mal genau 64 zurückzugeben.

Ich brauche helfen, den obigen Code zu optimieren, so dass es IMMER nur 64 zurückgibt. Ich weiß nicht genug darüber, wie der Teil "% 030x" funktioniert.

Ich habe versucht, auch eine längere Hexstring produzieren und mit Verkürzung:

myhex = myhex[:64] 

Aber ich war immer noch Strings zu sehen, dass weniger als 64 zurückgegeben werden sind.

Am Ende brauche ich nur genau 64 hexadezimale Zeichenfolge abgeleitet von einer großen Zahl wie 10 * 78, jedes Mal zurückgegeben. Ich

Lösung ging mit

import random 

ran = random.randrange(10**80) 
myhex = "%064x" % ran 

#limit string to 64 characters 
myhex = myhex[:64] 

print(myhex) 

scheint @ScottMillers beantwortet unten war der Schlüssel ich die Antwort finden musste, damit ich seine Antwort als die Lösung bin Auswahl, wollte aber meinen letzten Code schreiben, dass hat hier für mich gearbeitet.

Vielen Dank aller

Antwort

2

"%030x" sagt mit mindestens 30 Ziffern, Polsterung mit 0'en vor als notwendig, den zugehörigen Wert anzuzeigen. Da deine Zahlen fast immer größer sind, hilft dir das nicht viel.

Es klingt wie Sie brauchen "%064x".

+0

Dank. Dies war der Schlüssel in meiner endgültigen Lösung, also wähle ich sie als meine Antwort aus. –

0

Es gibt keine solchen Dinge wie "Hex-Zahlen"; Es gibt nur eine unterschiedliche Darstellung der gleichen Zahl (10 in Dezimal ist 0xA in Hex und 0b1010 in Binär, aber es ist immer noch die gleiche Zahl).

Dies erzeugt eine 64-stellige Hex-Zeichenfolge, aber manchmal ist das Ergebnis 63 oder sogar 61 Zeichen und ich bin mir nicht sicher warum? Ich brauche es jedes Mal genau 64 zurückzugeben.

so: Ich bitte Sie, geben Sie mir eine Zufallszahl über 0 und unter 1000; Wie viele Ziffern hat diese Nummer?

Rechts. Es kann ein, zwei oder drei Ziffern haben, wobei drei Ziffern der wahrscheinlichste Fall sind (es gibt 900 dreistellige Ziffern unter 1000, aber nur 90 zweistellige Ziffern und neun einstellige Ziffern).

Offensichtlich müssen Sie nur mit 0 vorfüllen!

Am Ende brauche ich nur genau 64 hexadezimale Zeichenfolge abgeleitet von einer großen Zahl wie 10 * 78, jedes Mal zurückgegeben.

Sie müssen darüber nachdenken, was Zufall bedeutet.Wenn Sie mit jeder einzelnen Ziffer, die aus einer gleichmäßigen Verteilung in 0..F gezogen wird, einverstanden sind, warum werfen Sie nicht einfach einen sechzehnseitigen Würfel 64-mal und verketten das Ergebnis? Python macht das extrem einfach

import random 
hexdigits = "ABCDEF" 
random_digits = "".join([ hexdigits[random.randint(0,0xF)] for _ in range(64) ]) 

EDIT:

In den Kommentaren unten, OP sagt, er will, dass die zufällige Zeichenfolge verwenden, um eine Bitcoin privaten Schlüssel Generation zu impfen.

Nie bauen Sie Ihre eigene Sämaschine, es sei denn, Sie sind wirklich ein Experte auf dem Gebiet. Also, obwohl ich glaube, dass diese 1024 Bit (wirklich, das ist, was eine 64-stellige Hexzahl ist) von Informationen sind zufällig, I wird nicht behaupten, dass dies für Kryptozwecke reicht.

Implementieren Sie Krypto nicht selbst, und mischen Sie sich nicht in die Seed-Generation ein, damit Sie Ihre Wege in der Stochastik, Numerik, Kryptographie und RNG, Computersicherheitsforschung und möglichen Angriffsvektoren kennen. Einfach nicht.

+0

danke für die Klärung, warum ich manchmal kürzere Ziffern sah. Es beginnt mit einer Zufallszahl. Meine Frage ist nun, ob rando.randint genug Entropie hat, um meine große Umfrageanforderung zu unterstützen? Wie bis zu 10 ** 78. Würdest du sagen, dass es so ist? –

+0

und Marcus Ihre Antwort bietet eine konsistente zufällige 64-Hex-Zeichenfolge wie erforderlich. Ich habe es millionenfach getestet und immer 64. –

+0

@NormanBird Wenn Sie nicht anfangen zu definieren, was "zufällig" für Sie bedeutet, gibt es natürlich keine Antwort darauf. Aber wahrscheinlich: Der Zufallszahlengenerator, den Python verwendet, ist ziemlich gut, also ist es wahrscheinlich, dass Sie keine Muster in Ihren 1024 Bits der Zufälligkeit sehen werden. –

0

Sie können os.urandom anstelle von Hexdump verwenden. Python 2.7:

import os 
num_digits = 32 
myhex = os.urandom(num_digits/2).encode('hex') 

Py3.4 +:

import os, codecs 
num_digits = 32 
myhex = codecs.encode(os.urandom(num_digits/2), 'hex').decode() 
-1

Ich würde so etwas wie dies versuchen:

mylist = [0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F] 
number = "" 

def randomhex(): 
    global mylist, number 
    while len(number) < 32: 
     number = number + random.choice(mylist) 

Und wenn Sie es als Nummer wollen, nicht als String nur eval().

+0

können Sie direkt einen String verwenden (siehe meine Antwort), der auch ein Sequenztyp ist, mit random.choice. –

+0

Aber: ** nie ** 'global' verwenden ohne einen guten Grund. Ihre Funktion ist ein Paradebeispiel dafür, wo man stattdessen "return" verwenden sollte. Ich denke, du solltest dein Python-Wissen ernsthaft erhöhen! –

+0

Nun, ich bin 15 und habe seit etwa einem halben Jahr programmiert und warum sollte ich vermeiden, globale Variablen in Funktionen zu verwenden? – marcb20012

0

kann das UUID-Modul eine 32 hexadezimalen Ziffern Objekt zurückgeben:

import uuid 
uuid.uuid4() 

UUID('cca1f20c-5a96-457d-9edc-bfed1e484851') 
Verwandte Themen