Wenn SHA256 einen alphanumerischen Hash erzeugt, wie kann ein Hash "weniger als ein bestimmter Wert" sein?

Ich hatte den Eindruck, dass die Methode von Bitcoin zur Validierung eines Hashs darin bestand, sicherzustellen, dass der Hash mit einer vorher festgelegten Anzahl von Nullen begann. Nachdem ich die Dokumente hier gelesen habe , sehe ich jedoch den folgenden Satz:

Um zu beweisen, dass Sie beim Erstellen eines Blocks zusätzliche Arbeit geleistet haben, müssen Sie einen Hash des Blockheaders erstellen, der einen bestimmten Wert nicht überschreitet. Um zu beweisen, dass Sie beim Erstellen eines Blocks zusätzliche Arbeit geleistet haben, müssen Sie einen Hash des Blockheaders erstellen, der einen bestimmten Wert nicht überschreitet. Wenn der maximal mögliche Hash-Wert beispielsweise 2^256 − 1 ist, können Sie beweisen, dass Sie bis zu zwei Kombinationen ausprobiert haben, indem Sie einen Hash-Wert kleiner als 2^255 erzeugen.

Dies ist für mich verwirrend, da das Bitcoin-Protokoll nach meinen Recherchen den SHA256-Hashing-Algorithmus verwendet, der alphanumerische Hashes erzeugt. Wenn ich beispielsweise eine leere Datei mit dem Namen „foobar.txt“ hash, erhalte ich „e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855“.

Meine Frage ist, wie kann eine alphanumerische Hash-Ausgabe "kleiner als" eine andere sein?

Sie verwechseln Werte mit Repräsentationen von Werten. Diese Zeichenfolge ist kein Wert, sondern eine Darstellung eines Werts.

Antworten (4)

Der Hash ist nicht alphanumerisch, sondern hexadezimal, also zur Basis 16. Das kannst du in eine Dezimalzahl umwandeln. In Ihrem Fall:

0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 = 1029873362495540970295352123225813227897959900648198034973379

Die eigentlichen Bytes sind eigentlich Basis-256 (8 Bit pro Byte), aber es ist relativ einfach, die Basis-256-Zeichenfolge hexadezimal darzustellen.

Nicht, dass andere Antworten hier falsch wären, aber nur um Ihre Verwirrung aus einem anderen Blickwinkel anzugehen:

SHA256-Hashing-Algorithmus, der alphanumerische Hashes erzeugt.

Das ist nicht wahr. Der Hash-Algorithmus erzeugt einen Strom von Bytes. Nur wenn Sie dieses Bündel von Bytes auf Ihrem Bildschirm anzeigen, ist es üblich, dass es hexadezimal ist (mit den "alphanumerischen" Zeichen A bis F), aber das dient nur zu Anzeigezwecken, um es für Menschen lesbar zu machen.

Sie können dieselben Bytes auch als große Dezimalzahl anzeigen (benötigt mehr Platz auf dem Bildschirm und hat nicht den Vorteil, dass jeweils zwei Ziffern genau ein Byte vom Original darstellen. Oder Sie können es binär anzeigen: 256 Nullen und Einsen.

Meine Frage ist, wie kann eine alphanumerische Hash-Ausgabe "kleiner als" eine andere sein?

Was hält Sie davon ab, eine Wortliste alphabetisch zu sortieren? Ein Wort wird „weniger als“ ein anderes Wort sein.

RE: Ihre Frage am Ende: Daran habe ich gedacht, der Unterschied ist, dass Hashes Zahlen und Buchstaben enthalten, während Wörter nur Buchstaben sind. Nehmen Sie einen Fall von zwei einstelligen alphanumerischen Zeichenfolgen. Ist „5“ größer oder kleiner als „b“? Mir war bisher nicht bewusst, dass Hashes hexadezimal (nicht alphanumerisch) sind; diese Tatsache beantwortet meine Frage.
@toomanyrichies Es ist weniger. Verwenden Sie die Reihenfolge 0123456789abcdef(ohne Berücksichtigung der Groß-/Kleinschreibung), wenn Sie hexadezimal alphabetisch sortieren.

Sie behandeln den Hash als Zahl zur Basis 16 und vergleichen ihn wie eine ganze Zahl.

Um beispielsweise bei normalen Zahlen festzustellen, dass 926 kleiner als 941 ist, folgen Sie im Wesentlichen dieser Argumentation:

  1. Die Nummern haben die gleiche Stellenzahl, also kann noch nichts bestimmt werden.
  2. Die Zahlen haben beide eine 9 an der 100er Stelle, also kann noch nichts bestimmt werden.
  3. 926 hat eine 2 an der Zehnerstelle, wo 941 eine 4 hatte, also ist 926 weniger.
  4. Die restlichen Ziffern sind egal.

Bei SHA256-Hashes ist es im Grunde derselbe Algorithmus (konzeptionell), Sie müssen nur af in die Zahlen aufnehmen. Wenn wir also zwei Hashes haben, 1a2cf... und 1b67e..., ist der erste kleiner, weil die zweite Ziffer "a" (die in der normalen numerischen Notation 10 ist) kleiner ist als "b" (die in der normalen numerischen Schreibweise 11 ist). numerische Notation).

Das sind Zahlen, die in Hexadezimalzahlen (oder Basis 16) geschrieben sind, im Gegensatz zu Dezimalzahlen (Basis 10), an die Sie gewöhnt sind. Dezimal verwendet 0-9, was 10 unabhängige Ziffern ergibt. Also wird 12 dezimal als '12' geschrieben. Hexadezimal verwendet 0-9 und af zusätzlich zu 16 unabhängigen Ziffern, so dass Dezimal 12 in Hexadezimal 'c' ist.