XOR und Strings

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: XOR und Strings

Beitrag von NicTheQuick »

Möglicherweise eine blöde Frage, aber hattest du den Debugger an?
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: XOR und Strings

Beitrag von TroaX »

Soo ich habe eben festgestellt, das der zweite Code performanter ist. Und zwar genau doppelt so schnell. Ist aber leider immernoch viel zu langsam.
NicTheQuick hat geschrieben:Möglicherweise eine blöde Frage, aber hattest du den Debugger an?
*hust* Ähhm oops? Jo :lol: Nochmal tempo verdoppelt.

Doofe Frage. Aber wie schreibe ich einen Quadwert, der maximal 255 beträgt in, in eine Byte-Variable. Als Beispiel Quadwert 155. Daraus wird, wenn ich es nur in eine Bytevariable kopiere -101. Das ist genau das Ergebnis, das ich ja nicht will ^^
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: XOR und Strings

Beitrag von Nino »

TroaX hat geschrieben:Doofe Frage. Aber wie schreibe ich einen Quadwert, der maximal 255 beträgt in, in eine Byte-Variable. Als Beispiel Quadwert 155.

Code: Alles auswählen

x.q = 155
y.a = x
Debug x
Debug y
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: XOR und Strings

Beitrag von TroaX »

Nino hat geschrieben:
TroaX hat geschrieben:Doofe Frage. Aber wie schreibe ich einen Quadwert, der maximal 255 beträgt in, in eine Byte-Variable. Als Beispiel Quadwert 155.

Code: Alles auswählen

x.q = 155
y.a = x
Debug x
Debug y
Danke! War aber ein total dämlciher Denkfehler von mir. Hätte ich nur mal in die Doku gesehen. Man arbeitet ja zu wenig mit Bytes :lol:

Endresultat:
Die beste Performance bekomm ich bei XOrHexString2 ohne Debugger bei 16er-Blöcken (Quad). Ich teste das ganze nochmal mit SHA1 256-Bit und vergleiche das mal mit der PHP-Implementierung. Wenn das nachher damit deutlich besser aussieht, dann nehme ich das so. Danke für die Hilfe :)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: XOR und Strings

Beitrag von NicTheQuick »

Wenn ich zu hause bin, baue ich dir noch eine schnelle Methode. Ich werde das doch wohl hinkriegen schneller zu sein als die ollen Stringfunktionen. 8)
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: XOR und Strings

Beitrag von TroaX »

NicTheQuick hat geschrieben:Wenn ich zu hause bin, baue ich dir noch eine schnelle Methode. Ich werde das doch wohl hinkriegen schneller zu sein als die ollen Stringfunktionen. 8)
Cool danke. ASM ist da nicht so meine Stärke. Und ich habe das Gefühl, das es nur so schneller gehen wird. Dann kann ich mich ja nochmals um die Generatoren kümmern. Die habe ich bisher immer nur mit Standard-Random gemacht. Ich werde die mal nach CryptRandom umbauen und vor allem die ganze Lib in ein Modul packen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: XOR und Strings

Beitrag von GPI »

Hier mein Testcode:

Code: Alles auswählen

EnableExplicit
Global Dim HexTable.a(127)
Procedure init()
  Protected i
  For i='0' To '9'
    HexTable(i)=(i-'0')
  Next
  For i='a' To 'f'
    HexTable(i)=(i-'a'+10)
  Next
  For i='A' To 'F'
    HexTable(i)=(i-'A'+10)
  Next
  For i=0 To 15
    HexTable(i)=Asc(Hex(i))
  Next
  
EndProcedure
init()


Procedure.s XOrHexString(a.s, b.s)
  Protected *a.Character = @a, *b.Character = @b
  Protected x.i
  
  If Len(a) <> Len(b)
    ProcedureReturn ""
  EndIf
  
  While *a\c
    *a\c - '0' - Bool(*a\c >= 'A') * ('A' - '0' - 10) - Bool(*a\c >= 'a') * ('a' - 'A')
    *b\c - '0' - Bool(*b\c >= 'A') * ('A' - '0' - 10) - Bool(*b\c >= 'a') * ('a' - 'A')
    *a\c ! *b\c
    *a\c + '0' + Bool(*a\c > 9) * ('a' - '0' - 10)
    
    *a + SizeOf(Character)
    *b + SizeOf(CHaracter)
  Wend
  
  ProcedureReturn a
EndProcedure

Procedure.s XOrHexString2(a.s, b.s)
  Protected i.i = 1, size.i = Len(a), result.s = ""
  
  If size <> Len(b)
    ProcedureReturn ""
  EndIf
  
  While size >= 8
    result + RSet(Hex(Val("$" + Mid(a, i, 8)) ! Val("$" + Mid(b, i, 8)), #PB_Long), 8, "0")
    i + 8
    size - 8
  Wend
  
  While size
    result + Hex(Val("$" + Mid(a, i, 1)) ! Val("$" + Mid(b, i, 1)), #PB_Long)
    i + 1
    size - 1
  Wend
  
  ProcedureReturn result
  
EndProcedure

Procedure.s xorhexstring3(a.s,b.s)
  ProcedureReturn Hex(Val("$"+a) ! Val("$"+b))
EndProcedure

Procedure.s xorhexstring4(a.s,b.s)
  Protected ret.s=Space(Len(a))
  Protected *achar.character=@a.s
  Protected *bchar.character=@b.s
  Protected *retchar.character=@ret
  
  While *achar\c>0
    *retchar\c=HexTable((HexTable(*achar\c&$7f)) ! (HexTable(*bchar\c&$7f)))
    
    *achar+SizeOf(character)
    *bchar+SizeOf(character)
    *retchar+SizeOf(character)
    
  Wend
  
  ProcedureReturn ret
EndProcedure
Procedure xorhexstring5(*retchar.character,*achar.character,*bchar.character)
  Protected value
  
  While *achar\c>0 
   *retchar\c=HexTable((HexTable(*achar\c&$7f)) ! (HexTable(*bchar\c&$7f)))
    
    *achar+SizeOf(character)
    *bchar+SizeOf(character)
    *retchar+SizeOf(character)
    
  Wend
EndProcedure


Define ret.s
Define t.i
Define i
OpenConsole()

Macro quote
  "
EndMacro


Macro test(aaa)
  
  PrintN(quote#aaa#quote)
  t=ElapsedMilliseconds()
  For i=0 To 1000000
    ret= aaa("123456789", "abcdef019")
  Next
  PrintN( ret)
  PrintN(Str(ElapsedMilliseconds()-t))
EndMacro

test(XOrHexString)
test(XOrHexString2)
test(xorhexstring3)
test(xorhexstring4)

PrintN(quote#aaa#quote)
t=ElapsedMilliseconds()
Define a$="123456789",b$="abcdef019",ret$="---------"
For i=0 To 1000000
  xorhexstring5(@ret$,@a$,@b$)
Next
PrintN( ret$)
PrintN(Str(ElapsedMilliseconds()-t))


Input()
Wichtig dürfte wieder sein: Wenns um geschwindigkeit geht, *NIEMALS* Strings als Parameter benutzen, sondern Pointer. Selbiges geht für Return-werte (sofern man weis, wie groß sie sind). Dann sind Steigerungen um 10x drin.

Code: Alles auswählen

XOrHexString
b9f9b9790
290
XOrHexString2
B9F9B9790
696
xorhexstring3
B9F9B9790
324
xorhexstring4
B9F9B9790
324
aaa
B9F9B9790
34
Edit: Ich weis nicht wo man in deinen Code XOR einfügen müsste. Ansonsten könnte man mal schauen, wie man das gesamte geschickter löst. Eventuell alles in ein Modul packen und mit globalen/threaded Strings arbeiten. Das könnte das ganze enorm beschleunigen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: XOR und Strings

Beitrag von NicTheQuick »

Genau so hätte ich es auch gemacht. Arbeit gespart. :lol: Danke GPI.
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: XOR und Strings

Beitrag von TroaX »

Also ich habe jetzt XOrHexString2 mit 16er-Blöcken mal mit SHA2 256-Bit getestet. Die Performance ist mit der von PBDKF2 PHP nahezu identisch. Allerdings verwenden die für deren Benchmark SHA1 256-Bit:

Code: Alles auswählen

Bench without Pepperlist and Compare
1 Iterations in 0 ms | Hash: ACEBEA01B37D148AA54D42208AC4229D06C591F6CA1DB3940ED9B3E702588274.9u774E8V
2 Iterations in 0 ms | Hash: 6E17CF4FDAB0CDA6EBF34DC5DF57814D44057787D0E7C22EFA2C01F74CE79B09.jjRm1P07
4 Iterations in 0 ms | Hash: 8F9C38BE9968E4538EA4D13AF3F7CA47E9411DB92DE858CA19EE1B8BA6937BEE.Tfk3631x
8 Iterations in 0 ms | Hash: 63D299F598BEABE0F19CD10F71916EFCE5A15F0D0F524079C42DF352525D1236.QeGyrZNJ
16 Iterations in 0 ms | Hash: DB1997E5E66811B5B23DDA9E4B5D9E3F230BDB580D512A3A20104C9D94FA82F8.9y9ClZEt
32 Iterations in 1 ms | Hash: FD4532FEEBF3425D740B6E996197764662DD4F4F0CAEDDBA06EA7412C409210E.UTvBclOo
64 Iterations in 0 ms | Hash: C40E407630F00FBD9CB9188319CF955EF205ADDA7C7B34E30B80E99EE3DC5026.41b4V253
128 Iterations in 1 ms | Hash: 71AA81F2EA16796DEF932E6699217C6456171AC4AD99E98A8734050201606D4A.yD4h55TW
256 Iterations in 1 ms | Hash: F91B3B2A65213F70BF55BDDF3ACA094995EE08D1377BA783592130C7FA16E6E2.uIz3oW4G
512 Iterations in 2 ms | Hash: B08B70BBBB61FB1ED37D0F9BE0CB1BE4F67F739B0EEAFC68A2CB769F7352CE8B.utU76EOH
1024 Iterations in 5 ms | Hash: 34AA3FD4EAB9379A4272AF7C14A65FC518F1F5141E9065F5B3F0209F0DA6CA01.HH64ZwmU
2048 Iterations in 9 ms | Hash: 2D2D8D098CAA933B8890EB3480391E0FE47FE132A763F4542B1859C11962AB5C.r2s4de9t
4096 Iterations in 18 ms | Hash: 6D8B02C0BBC67A21AA8702CB0AC9943BEAA85E398710B6BC0D841E2E0F4DF359.7GWf7r00
8192 Iterations in 36 ms | Hash: B1EDE54C3A83A99084EB006F55767EC08C1ABD6E4900193CB821AC5708D55686.WxR3pe1U
16384 Iterations in 72 ms | Hash: 1B90D21193FA7459858CDEBDF4558EE3BE668AB263073F4EB61552C0C44C051C.8h1UH899
32768 Iterations in 144 ms | Hash: 5284DEB6C5C1CAEDD076719235F65405EDFC844780C0B10F1252C730FD3B8F28.MmJUpXj6
65536 Iterations in 288 ms | Hash: 00B2045E8B0D34FD1038B523DD98E86DAA6A0B9DA7D51F738FE4C4838CE7E725.9607luYb
131072 Iterations in 576 ms | Hash: 2A2000B1BC2B6DD115ACA9BD38076800E5F467B3E1A47F389E4B69682BE3BD24.5x0uXBmF
262144 Iterations in 1153 ms | Hash: 8624AE3725850C01720B71B75AB2780CC2DBEAB5DB622BCD669FA9F193C0F9C6.n882RQoQ
524288 Iterations in 2309 ms | Hash: C131812DAB8A60195C825646FAFB024534B159DF7C720F9B649438B8975298FF.x9t03aA9
1048576 Iterations in 4620 ms | Hash: 0974E4B867B058BE3195155538F14DA7F01DE10F5CD66A4CB96C0C4383A90FC4.Uo1xEL88
2097152 Iterations in 9235 ms | Hash: AC403D831AB2F1089CAEAEF8CA290F07B08AF1B2B01F7C551BBCE1B3742D1696.XWgUITJg
4194304 Iterations in 18490 ms | Hash: 39026863C9882C574F39C2C3EA7C4F6A13B341D14043B1980462960427D0DBA1.z78tKVZ8
8388608 Iterations in 36998 ms | Hash: 05FFB297E13870FBAACEFD102729950374A8A7DF4D02A78943BC87443D49D602.mzIX23L0
16777216 Iterations in 74002 ms | Hash: 93585A855EEB97778EDC86211A9D76EC5123080B9E07EB9F6A651DCDD9CBFE68.59289aq7
@GPI: Meinst du in der PWLib? Wenn ja aktuell noch in Zeile 38 in der Prozedur IterateHashing()
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: XOR und Strings

Beitrag von GPI »

Interessant wirds, wenn man die Strings ganz lange macht, bspw. "123456789123456789123456789123456789", "abcdef019abcdef019abcdef019abcdef019".

Code: Alles auswählen

XOrHexString
b9f9b9790b9f9b9790b9f9b9790b9f9b9790
660
XOrHexString2
B9F9B9790B9F9B9790B9F9B9790B9F9B9790
2526
xorhexstring3
F9B9790B9F9B9790
513
xorhexstring4
B9F9B9790B9F9B9790B9F9B9790B9F9B9790
579
aaa
B9F9B9790B9F9B9790B9F9B9790B9F9B9790
126
Methode 3 (nur mit Val() arbeiten) steigt da natürlich aus, weil es den Quad-Zahlenraum sprengt. Zeitlich explodiert Methode 2.

@TroaX
Zeile 38 ist "hashedstring = StringFingerprint(hashedstring + Str(x),#PB_Cipher_SHA3,shadepth)" - da ist kein XOR...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten