[Request] Brute-Force algorithmus

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

TheGamePope

Betreff: [Request] Brute-Force algorithmus

BeitragDo, Jul 22, 2010 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute.
Ich wollte mal fragen, ob mir irgendjemand einen schnellen bruteforce algorithmus geben kann, der nicht so aussieht:
Code: [AUSKLAPPEN]
Global charset$[] = "a", "b", ...
Global brutestring$

For a$ = eachIn charset
     For b$ = EachIn charset
          'Für mehr entsprechend viele for loops hinzufügen
          brutestring = a + b
     next
next


Gibts da noch ne andere möglichkeit?

Skabus

BeitragDo, Jul 22, 2010 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau willst du machen?

Alle möglichen Kombinationen im String enthaltenen Zeichen als Permutationsmenge ausgeben?


MfG

(hör sich einer das an o.o" uni schädigt -___-)
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
 

BBPro2

BeitragDo, Jul 22, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
yo uni schädigt echt... da denkst du dir einfach wörter wie permutationsmenge aus! ^^
sowas gibts nich Wink

und was er will ist einfach jede möglichkeit von strings der länge n

in dem fall ist n = 2


es gibt viele möglichkeiten die verhindern dass du hier tausende von schleifen ineinander basteln musst

da das ganze aber nach nem bruteforce passwort rausfind algo aussieht werd ich dir ma nich helfen.
das musste schon alleine hinkriegen, sorry


es sei denn du kannst mir sagen was du damit machen willst..

Skabus

BeitragDo, Jul 22, 2010 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh wir sind heut wieder kleinlich Rolling Eyes

So nebenbei: Man kann Permutationen als Menge darstellen...

Also wenns geht, bitte nicht auf mich einhauen, das macht mich traurig -___-


Und außerdem meinen wir das selbe^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
 

BBPro2

BeitragDo, Jul 22, 2010 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
war doch gar net bös gemeint^^

und ja stimmt wir meinen das gleiche, dachte zuerst du meinst was anderes - aber im prinzip nich Smile

BladeRunner

Moderator

BeitragFr, Jul 23, 2010 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nutze Rekursion für dein Vorhaben, GamePope. Aber erwarte nicht dass wir dir deine Programme schreiben, schon gar nicht wenn sie einem zweifelhaften Zweck dienen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

TheGamePope

BeitragFr, Jul 23, 2010 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also. Ich weis nich ob ihr das als böse ansieht, aber ich habe einfach aus spaß vor, md5 tabellen zu generieren. War nur also übung gedacht. Den code hab ich inzwischen.

@BladeRunner
Mir is klar das ihr meine programme nich schreibt. Bin ja nich blöd. Inzwischen hab ich den algorithmus gefunden.
 

TheGamePope

BeitragSa, Jul 24, 2010 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut also ich hab das program jetzt fertig.
Allerdings hab ich eine frage. Ich hab das ganze jetzt schon in threads ausgelagert (siehe code) aber es nutzt immer noch nur einen von vire rechenkernen. Was kann ich da machen, das das programm alle ausnutzt? (Md5.bmx ist die blitzmax konvertierung von Craig Kiesau's BlitzBasic MD5-algorithmus)


Code: [AUSKLAPPEN]

Include "Md5.bmx"


Global charset:String[]=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

Global word_length:Int=5

Global writing:Byte = False

Global outMd5File:TStream=WriteFile("Table1.Md5")
Global outNamFile:TStream=WriteFile("Table1.Nam")
Global outNamLenFile:TStream=WriteFile("Table1.Nam.Len")
thread:TMap = New TMap

Print "We'll generate "+GetNums(word_length, charset.length)+" strings"
For I3=0 To word_length-1
   Delay 5
   MapInsert(thread,String(I3),CreateThread(Brute, String(I3)))
Next

Local allDone:Byte = False

While Not allDone
   running:Byte = False
   For o:Object = EachIn MapValues(thread)
      t:TThread = TThread(o)
      If (t.Running())
         running = True
      EndIf
   Next
   If (Not running)
      allDone = True
   EndIf
   Delay 10
Wend
      
CloseStream(outMd5File)
CloseStream(outNamFile)
CloseStream(outNamLenFile)

Function Brute:Object(Data:Object)
   _len = Int(Data.ToString())
   Print "Starting run "+(_len+1)+" of "+word_length
   Print "Thread has to do "+long((_len+1)^charset.length+charset.length-1)+" strings"
   Local word:Int[] = New Int[_len+2]
   For I2=0 To _len+1
      word[I2] = 0
   Next
   Local wort$
   Repeat
      wort$=""
      For I2=0 To _len
         wort$=wort$+charset[word[I2]]
      Next
      wort$ = Reverse(wort)
      While writing
         Delay 10
      Wend
      writing = True
      outMd5File.WriteString(Md5(wort))
      outNamFile.WriteString(wort)
      outNamLenFile.WriteInt(Len(wort))
      writing = False
      word[0]=word[0]+1
      For I2=0 To _len
         If word[I2]>charset.length-1 Then
            word[I2]=0
            word[I2+1]=word[I2+1]+1
         EndIf
      Next
   Until word[_len+1]=1
   Print "Run "+(_len+1)+" of "+word_length+" done"
End Function

Function Reverse$(_msg$)
   _response$ = ""
   For a=1 To Len(_msg$)
      _response$ = _response$ + Left(Right(_msg$,a),1)
   Next
   Return _response
End Function

Function GetNums(exp1, exp2)
   result = 0
   For a=1 To exp1
      result = result + a^exp2
   Next
End Function
  • Zuletzt bearbeitet von TheGamePope am Sa, Jul 24, 2010 15:19, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragSa, Jul 24, 2010 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne deine Frage direkt beantworten zu können, da der Code als solches ohne die Include ja nicht lauffähig ist, mehrere Anmerkungen/Fragen:

1. Warum all diese delays in deinem Code?
2. Warum speicherst Du deine Einträge in einer Map, wenn du doch nie explitit per Key auf eines deiner Objekte zugreifen willst?
3. Dein Code ist nicht Threadsafe! Du benutzt aus deinen Threads heraus Writestring etc., welche für sich nicht threadsafe sind. Bevor Du einen Thread was in die Datei eintragen lässt musst Du den Schreibzugriff sichern, denn ansonsten hast Du später nur Datenmüll in deinem File, weil die Threads kunterbunt durcheinander wursteln. Schau dir dazu TMutex an.
4. Um die Performance zu steigern solltest du auf basickonforme Dinge wie die Stringfunktionen verzichten und stattdessen mit Slices arbeiten.
5.Code: [AUSKLAPPEN]
      While writing
         Delay 10
      Wend  '???
Writing wird vorher in der Funktion nie benutzt und kann daher nur false sein. Threads teilen sich den Variablenraum nicht Wink
6. Gewöhn dir Programmieren mit Strict, besser noch mit Superstrict an, dann passieren solche Scopefehler nicht mehr, weil der Compiler meckert.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

TheGamePope

BeitragSa, Jul 24, 2010 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Die delays am anfang sind einfach nur da, das das print gescheit funktioniert.
2. TThread lässt sich nicht als Arry benutzen und TList is auch nich schneller
3. Hatte eigentlich gedacht das ich durch die globale variable writing zu sichern. Werds mit ner Mutex machen
4. Muss ich noch lernen Wink
5. Siehe 3. War dafür gedacht, das während des schreibzugrifs niemand anders versucht darauf zuzugreifen
6. Werd ich machen
7. Und wie lager ich das jetzt auf mehrere Kerne aus?

BladeRunner

Moderator

BeitragSa, Jul 24, 2010 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
- Local arr:TThread[20] funktioniert hier bei mir ohne Probleme. Und TList wäre im aktuellen Fall sicher schneller als die TMap, weil es den Folgelink immer mit sich führt Wink

- Die Globale hab ich übersehen, insgesamt ist es aber sowieso günstiger den Gebrauch von Globalen zu vermeiden wo es geht.
- Die Threads sollten, wenn sie wirklich parallel laufen, automatisch von deinem OS auf die einzelnen Kerne verteilt werden. Wenn das nicht geschieht werden entweder nicht parallel Threads erstellt (Delay sei dank? - Wir bremsen das Programm so lange bis alle anderen Threads fertig sind - nur eine Vermutung) oder Du hast sonst einen Fehler im Code, was sich mir aber ohne lauffähiges Beispiel nicht erschliesst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

TheGamePope

BeitragSa, Jul 24, 2010 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
So. Hab jetzt mal nen grosteil von dem was du meintest verbessert und werd dieses mal auch die Md5.bmx dazu tun. Auslagerung is jetzt besser, nutzt aber nur 30% von 4x2,4 ghz aus. SuperStrict / Strict hab ich hier jetzt nicht angewendet, da das auch bei der Md5 routine rummeckert.

Code: [AUSKLAPPEN]
Include "Md5.bmx"


Global charset:String[]=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

Global word_length:Int=6

Global writing:TMutex = CreateMutex()

Global outMd5File:TStream=WriteFile("Table1.Md5")
Global outNamFile:TStream=WriteFile("Table1.Nam")
Global outNamLenFile:TStream=WriteFile("Table1.Nam.Len")
Local thread:TThread[] = New TThread[word_length]

Print "We'll generate "+GetNums(word_length, charset.length)+" strings"
For I3=0 To word_length-1
   thread[I3] = CreateThread(Brute, String(I3))
Next

Local allDone:Byte = False

While Not allDone
   running:Byte = False
   For t:TThread = EachIn thread
      If (t.Running())
         running = True
      EndIf
   Next
   If (Not running)
      allDone = True
   EndIf
   Delay 10
Wend
      
CloseStream(outMd5File)
CloseStream(outNamFile)
CloseStream(outNamLenFile)

Function Brute:Object(Data:Object)
   _len = Int(Data.ToString())
   Print "Starting run "+(_len+1)+" of "+word_length
   Print "Thread has to do "+Long((_len+1)^charset.length+charset.length-1)+" strings"
   Local word:Int[] = New Int[_len+2]
   For I2=0 To _len+1
      word[I2] = 0
   Next
   Local wort$
   Repeat
      wort$=""
      For I2=0 To _len
         wort$=wort$+charset[word[I2]]
      Next
      wort$ = Reverse(wort)
      LockMutex(writing)
      outMd5File.WriteString(Md5(wort))
      outNamFile.WriteString(wort)
      outNamLenFile.WriteInt(Len(wort))
      UnlockMutex(writing)
      word[0]=word[0]+1
      For I2=0 To _len
         If word[I2]>charset.length-1 Then
            word[I2]=0
            word[I2+1]=word[I2+1]+1
         EndIf
      Next
   Until word[_len+1]=1
   Print "Run "+(_len+1)+" of "+word_length+" done"
End Function

Function Reverse$(_msg$)
   _response$ = ""
   For a=1 To Len(_msg$)
      _response$ = _response$ + Left(Right(_msg$,a),1)
   Next
   Return _response
End Function

Function GetNums:Long(exp1, exp2)
   result:Long = 0
   For a=1 To exp1
      result = result + a^exp2
   Next
   Return result
End Function


Md5.bmx

Code: [AUSKLAPPEN]
Global MD5_x[]

'MD5 for BlitzMax
'Derived from Craig Kiesau's BlitzBasic MD5 function
'Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm

Function MD5$(sMessage$)

    'Pads the String as per the MD5 standard
    nblk = ((Len(sMessage$) + 8) Shr 6) + 1  'number of 16-word blocks
    Local MD5_x[(nblk * 16)]
    'Zero pad the String
    For i = 0 To nblk * 16 - 1
      MD5_x[i] = 0
    Next
    'Convert To array of "words"
    For i = 0 To (Len(sMessage$) - 1)
      MD5_x[(i Shr 2)] = MD5_x[(i Shr 2)] | (Asc(Mid(sMessage$, (i + 1), 1)) Shl ((i Mod 4) * 8))
   Next
    MD5_x[(i Shr 2)] = MD5_x[(i Shr 2)] | (128 Shl (((i) Mod 4) * 8))
    MD5_x[nblk * 16 - 2] = Len(sMessage$) * 8
   
        'Set initial values
    MD5_a = 1732584193 '&H67452301
    MD5_b = -271733879 '&HEFCDAB89
    MD5_c = -1732584194 '&H98BADCFE
    MD5_d = 271733878 '&H10325476


        'Loop through the words
    For k = 0 To (nblk * 16 - 1) Step 16
        MD5_AA = MD5_a
        MD5_BB = MD5_b
        MD5_CC = MD5_c
        MD5_DD = MD5_d
    'Round 1
        MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 0], 7, -680876936) '&HD76AA478
        MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 1], 12, -389564586) '&HE8C7B756
        MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 2], 17, 606105819 )'&H242070DB
        MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 3], 22, -1044525330) '&HC1BDCEEE
        MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 4], 7, -176418897) '&HF57C0FAF
        MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 5], 12, 1200080426 )'&H4787C62A
        MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 6], 17, -1473231341) '&HA8304613
        MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 7], 22, -45705983) '&HFD469501
        MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 8], 7, 1770035416) '&H698098D8
        MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 9], 12, -1958414417 )'&H8B44F7AF
        MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 10], 17, -42063 )'&HFFFF5BB1
        MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 11], 22, -1990404162) '&H895CD7BE
        MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 12], 7, 1804603682) '&H6B901122
        MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 13], 12, -40341101) '&HFD987193
        MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 14], 17, -1502002290) '&HA679438E
        MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 15], 22, 1236535329) '&H49B40821
    'Round 2
        MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 1], 5, -165796510) '&HF61E2562
        MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 6], 9, -1069501632) '&HC040B340
        MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 11], 14, 643717713) '&H265E5A51
        MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 0], 20, -373897302) '&HE9B6C7AA
        MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 5], 5, -701558691) '&HD62F105D
        MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 10], 9, 38016083) '&H2441453
        MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 15], 14, -660478335) '&HD8A1E681
        MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 4], 20, -405537848) '&HE7D3FBC8
        MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 9], 5, 568446438) '&H21E1CDE6
        MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 14], 9, -1019803690) '&HC33707D6
        MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 3], 14, -187363961) '&HF4D50D87
        MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 8], 20, 1163531501) '&H455A14ED
        MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 13], 5, -1444681467) '&HA9E3E905
        MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 2], 9, -51403784) '&HFCEFA3F8
        MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 7], 14, 1735328473) '&H676F02D9
        MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 12], 20, -1926607734) '&H8D2A4C8A
    'Round 3
        MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 5], 4, -378558) '&HFFFA3942
        MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 8], 11, -2022574463) '&H8771F681
        MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 11], 16, 1839030562) '&H6D9D6122
        MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 14], 23, -35309556) '&HFDE5380C
        MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 1], 4, -1530992060) '&HA4BEEA44
        MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 4], 11, 1272893353) '&H4BDECFA9
        MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 7], 16, -155497632) '&HF6BB4B60
        MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 10], 23, -1094730640) '&HBEBFBC70
        MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 13], 4, 681279174) '&H289B7EC6
        MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 0], 11, -358537222) '&HEAA127FA
        MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 3], 16, -722521979) '&HD4EF3085
        MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 6], 23, 76029189) '&H4881D05
        MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 9], 4, -640364487) '&HD9D4D039
        MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 12], 11, -421815835) '&HE6DB99E5
        MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 15], 16, 530742520) '&H1FA27CF8
        MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 2], 23, -995338651) '&HC4AC5665
    'Round 4
        MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 0], 6, -198630844) '&HF4292244
        MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 7], 10, 1126891415) '&H432AFF97
        MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 14], 15, -1416354905) '&HAB9423A7
        MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 5], 21, -57434055) '&HFC93A039
        MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 12], 6, 1700485571) '&H655B59C3
        MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 3], 10, -1894986606) '&H8F0CCC92
        MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 10], 15, -1051523) '&HFFEFF47D
        MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 1], 21, -2054922799) '&H85845DD1
        MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 8], 6, 1873313359) '&H6FA87E4F
        MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 15], 10, -30611744) '&HFE2CE6E0
        MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 6], 15, -1560198380 )'&HA3014314
        MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 13], 21, 1309151649) '&H4E0811A1     
        MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 4], 6, -145523070) '&HF7537E82
        MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 11], 10, -1120210379) '&HBD3AF235
        MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 2], 15, 718787259) '&H2AD7D2BB
        MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 9], 21, -343485551) '&HEB86D391

        MD5_a = MD5_a + MD5_AA
        MD5_b = MD5_b + MD5_BB
        MD5_c = MD5_c + MD5_CC
        MD5_d = MD5_d + MD5_DD
    Next

    Return Upper(WordToHex$(MD5_a) + WordToHex$(MD5_b) + WordToHex$(MD5_c) + WordToHex$(MD5_d))
End Function

Function MD5_F(x, y, z)
        Return ((x & y) | (~(x) & z))
End Function

Function MD5_G(x, y, z)
    Return ((x & z) | (y & (~(z))))
End Function

Function MD5_H(x, y, z)
    Return (x ~ y ~ z)
End Function

Function MD5_I(x, y, z)
    Return (y ~ (x | (~z)))
End Function

Function MD5_FF(a, b, c, d, x, s, ac)
    a = (a + ((MD5_F(b, c, d)+ x)+ ac))
    a = RotateLeft(a, s)
    Return a + b
End Function

Function MD5_GG(a, b, c, d, x, s, ac)
    a = (a + ((MD5_G(b, c, d) + x) + ac))
    a = RotateLeft(a, s)
    Return a + b
End Function

Function MD5_HH(a, b, c, d, x, s, ac)
    a = (a + ((MD5_H(b, c, d) + x) + ac))
    a = RotateLeft(a, s)
    Return a + b
End Function

Function MD5_II(a, b, c, d, x, s, ac)
    a = (a + ((MD5_I(b, c, d) + x) + ac))
    a = RotateLeft(a, s)
    Return a + b
End Function

Function RotateLeft(lValue, iShiftBits)
    Return (lValue Shl iShiftBits) | (lValue Shr (32 - iShiftBits))
End Function

Function WordToHex$(lValue)
   Local returnString$
   returnString$ = Hex$(lValue)
   Return returnString$[6..8] + returnString$[4..6] + returnString$[2..4] + returnString$[0..2]
End Function
 

BBPro2

BeitragSa, Jul 24, 2010 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Die Globale hab ich übersehen, insgesamt ist es aber sowieso günstiger den Gebrauch von Globalen zu vermeiden wo es geht.


aber auch mit einer globalen bool variable ist ein exklusiver schreibzugriff nicht gesichert, daher sollte
man IMMER mutex verwenden.

angenommen du hast 2 threads und beide überprüfen GLEICHZEITG ob writing false ist...
dann können beide writing auf true setzen (lost update) und munter werkeln

zu solchen effekten kommt es bei allem möglichen - auch bei vermeindlich atomaren aktionen
wie der erhöhung einer variable um 1
auch hier sind mutexe pflicht, denn solche atomaren aktionen sind in assemblercode nicht mehr atomar und
es kann zu effekten kommen wie z.b. T1 und T2 zählen n versetzt gleichzeitig um 1 hoch
und am ende ist n nur um 1 größer geworden, etc.

also: immer MUTEX Smile

BladeRunner

Moderator

BeitragSa, Jul 24, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bezog mich bei der Global-Geschichte auch nicht auf Multithreading. Da ist selbstredend der Mutex alleiniges Mittel der Wahl.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group