C# vergelijk functie werkt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Mijn vraag
Ik heb een klein programma geschreven, dat voor file updates checkt zeg maar en wanneer deze nodig zijn download (wanneer ze anders zijn dan op de remote server). Het werkte bijna compleet. Nu loop ik tegen een probleem aan. Ik heb een gui en als ik die open start hij een backgroundworker en vervolgens zal die een functie aanroepen in mijn class, daar doet hij wat logic en vervolgens maakt hij 3 threads aan die dan de md5 berekenen van de files en hier zullen die md5's dan vergeleken worden.. De compare functie(s) die op MSDN staan heb ik een voor een getest. Geen ervan werkt, als de string precies hetzelfde is of juist niet, het resultaat is altijd false..

Debuggen :
https://s18.postimg.org/4ujog6vp5/77555.png

Relevante software en hardware die ik gebruik
  • VS2015 C#
  • Win 7 prof x64 SP1
  • Target CLR 4.0 (Any CPU)
Wat ik al gevonden of geprobeerd heb
  • VS restarten
  • Alle compare functies getest

[ Voor 8% gewijzigd door r_AllocStarByte op 29-05-2017 15:52 ]

Beste antwoord (via r_AllocStarByte op 29-05-2017 20:17)


  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:27

Standeman

Prutser 1e klasse

Zomaar een brainfart: misschien hebben ze een verschillende encoding?

The ships hung in the sky in much the same way that bricks don’t.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Salmon
  • Registratie: Juli 2009
  • Laatst online: 23-07 21:55

Salmon

.NET developer

.Equals() op een string?

MSDN

[ Voor 67% gewijzigd door Salmon op 29-05-2017 15:54 ]


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 04-10 00:19
Aangezien je de hashes hebt gemaskeerd kan ik niet zien of ze inderdaad gelijk zijn, maar probeer is .ToUpper() of .ToLower() bij de vergelijking.

Anders zou ik ze in WinMerge gooien om te kijken of ze inderdaad 100% identiek zijn.

Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Allemaal hetzelfde resultaat:
  • .equals
  • .compareto
  • string.compare
  • ==

Acties:
  • 0 Henk 'm!

  • geforce5_guy
  • Registratie: December 2001
  • Niet online
Als je puur wil weten of ze gelijk zijn of niet: string.equals link

Als je iets meer wilt weten: string.compare link

Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Ik deed voorheen:

if (string.Compare(md5sumLocal, md5sumRemote) != -1)
{
//hier mijn item toevoegen aan een list.
}

Dit werkte! maar opeens niet meer. Nu is het resultaat altijd "false" of hetzelfde.

Acties:
  • 0 Henk 'm!

  • Salmon
  • Registratie: Juli 2009
  • Laatst online: 23-07 21:55

Salmon

.NET developer

r_AllocStarByte schreef op maandag 29 mei 2017 @ 15:54:
[...]


Allemaal hetzelfde resultaat:
  • .equals
  • .compareto
  • string.compare
  • ==
Reboot PC dan maar is, of restart je VS. Ik heb dit ook wel is gehad. Bij mij flikte VS het zelfs wel is om een niet gelijke string if-statement als true aan te geven en dan in de if te springen. Een reboot doet soms wonderen.

De
code:
1
md5sumLocal.Equals(md5sumRemote)
zou wel gewoon moeten werken.

[ Voor 7% gewijzigd door Salmon op 29-05-2017 15:59 ]


Acties:
  • 0 Henk 'm!

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 05-10 14:51

Vae Victis

Dark Lord of the Sith

Hebben de strings dezelfde cultures?
Probeer daar eens mee te spelen.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 07-10 14:42

Cloud

FP ProMod

Ex-moderatie mobster

Tja als de strings écht gelijk zijn, dan zouden die methoden wel gewoon true teruggeven. Misschien een verschil in hoofdletters of vage tekens ergens? CultureInfo?

Wat geeft:
C#:
1
string1.Equals(string2, StringComparison.OrdinalIgnoreCase);


En anders even copy pasten in een Notepad++ en kijken of ze daar echt gelijk zijn?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • +1 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

Als string.compare 1 i.p.v. -1 teruggeeft zijn ze nog steeds ongelijk. .compare is bedoelt voor sortering.
Compares two specified String objects and returns an integer that indicates their relative position in the sort order.
.compare en .equals zijn dus zeker niet hetzelfde!

[ Voor 9% gewijzigd door Creepy op 29-05-2017 16:07 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Dit is echt raar..

if (md5sumLocal.Equals(md5sumRemote))
Wanneer hetzelfde: false
Wanneer beide anders: false

if (md5sumLocal == md5sumRemote)
Wanneer hetzelfde: false
Wanneer beide anders: false

if (string.Compare(md5sumLocal, md5sumRemote) == 0)
Wanneer hetzelfde: -1
Wanneer beide anders: -1

if (string.CompareOrdinal(md5sumLocal, md5sumRemote) == 0)
Wanneer hetzelfde: 8155
Wanneer beide anders: -4


if (md5sumLocal.CompareTo(md5sumRemote) == 0)
Wanneer hetzelfde: -1
Wanneer beide anders: -1

Acties:
  • 0 Henk 'm!

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 14:25
Probeer eens hardcoded:
if ("text" == "text")

Wat krijg je dan?

*sowieso


Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
DonJunior schreef op maandag 29 mei 2017 @ 16:18:
Probeer eens hardcoded:
if ("text" == "text")

Wat krijg je dan?
Afbeeldingslocatie: https://i.imgur.com/XiwMEQb.png

Vreemd..

Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Creepy schreef op maandag 29 mei 2017 @ 16:06:
Als string.compare 1 i.p.v. -1 teruggeeft zijn ze nog steeds ongelijk. .compare is bedoelt voor sortering.

[...]

.compare en .equals zijn dus zeker niet hetzelfde!
Dit is zeker niet hetzelfde, maar het vreemde is dat het voorheen wel werkte, en nu niet meer. Ik ga mijn werkstation eens herstarten. Misschien helpt dit..

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:27

Standeman

Prutser 1e klasse

Zomaar een brainfart: misschien hebben ze een verschillende encoding?

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 07-10 14:42

Cloud

FP ProMod

Ex-moderatie mobster

Vreemd niet echt. Nu weet je tenminste één ding zeker. Je string vergelijking is goed, de strings zijn echter gewoon verschillend.

Nu is het nog uitzoeken op welk punt ze verschillen en zoals @Creepy ook stelt; ik zou geen .Compare gebruiken voor string vergelijking op basis van overeenkomst. Pak gewoon string.Equals met een goede StringComparison optie.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • -hopsa-
  • Registratie: Maart 2012
  • Laatst online: 04-09 16:39
Lama

[ Voor 93% gewijzigd door -hopsa- op 29-05-2017 16:29 ]


Acties:
  • 0 Henk 'm!

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 14:25
Doe anders is je md5sumLocal nog een keer ToString() en probeer het nog eens. Ik vermoed hetzelfde als wat @-hopsa- boven mij aangeeft. Volgens mij die je een ToString() BINNEN de retMD5 functie en niet daarna nogmaals.

*sowieso


Acties:
  • 0 Henk 'm!

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 05-10 14:51

Vae Victis

Dark Lord of the Sith

Cloud schreef op maandag 29 mei 2017 @ 16:25:
[...]

Vreemd niet echt. Nu weet je tenminste één ding zeker. Je string vergelijking is goed, de strings zijn echter gewoon verschillend.

Nu is het nog uitzoeken op welk punt ze verschillen en zoals @Creepy ook stelt; ik zou geen .Compare gebruiken voor string vergelijking op basis van overeenkomst. Pak gewoon string.Equals met een goede StringComparison optie.
Met ^^

Verder MSDN: String.Equals Method (String, StringComparison) (System)

Niet aanvallend bedoeld, maar als je (string ) vergelijkings functies test even verder kijken welke opties je allemaal hebt.

Acties:
  • +1 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
De value in het debug console verteld nog niet welk type de beide variabelen zijn. Debug console doet voor beide variabelen een call naar .ToString() die het object vertaald naar iets (meestal een string).En heel toevallig kunnen die identiek zijn.

Die tweede is een string (vanwege .ToString()). Maar die eerste ("md5") kan best wel eens een ander type zijn. Doe eens in je Console immediatly op moment van break een statement van:
md5sumLocal.GetType().Fullname
md5sumRemote.GetType().FullName
Daar moet het verschil in zitten.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 07-10 14:42

Cloud

FP ProMod

Ex-moderatie mobster

@robertpNL dat dacht ik ook maar als je naar het screenshot van zijn code bekijkt in de startpost, dan zie je daar dat beide gedeclareerd worden als string. Het enige wat misschien kan is dat die methode retMD5() een variable oplevert die een impliciete cast naar string heeft maar dat lijkt me wat onwaarschijnlijk.

Punt is dat de vergelijking in de if-statement die hij doet, wel degelijk twee string variabelen lijkt te bevatten.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • mrfu
  • Registratie: Februari 2006
  • Niet online

mrfu

Quis custodiet ipsos custodes?

MD5 ToString() geeft de string representation of the object. De MS docs zeggen dus niet dat je de exacte string waarde van de hash terug krijgt. Om die eruit te halen moet je de byte[] zelf naar een string omzetten.

Ik heb jouw exacte situatie nagebootst en ik krijg ook 2x FALSE eruit ;)
Link naar super cool online voorbeeldje welke je zelf kan aanpassen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public string CalculateMD5Hash(string input)
{
    // step 1, calculate MD5 hash from input
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);
    // Step 2, convert byte array to hex string
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
        sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
}


(Een alternatief is: Convert.ToBase64String(), daar kan een array in.)

[ Voor 27% gewijzigd door mrfu op 29-05-2017 17:09 ]


Acties:
  • 0 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Dan moeten er hidden character aanwezig zijn. Ik ben benieuwd of waarde van Length van beide variabelen gelijk zijn. Ik twijfel.

Acties:
  • 0 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
robertpNL schreef op maandag 29 mei 2017 @ 16:35:
De value in het debug console verteld nog niet welk type de beide variabelen zijn. Debug console doet voor beide variabelen een call naar .ToString() die het object vertaald naar iets (meestal een string).En heel toevallig kunnen die identiek zijn.

Die tweede is een string (vanwege .ToString()). Maar die eerste ("md5") kan best wel eens een ander type zijn. Doe eens in je Console immediatly op moment van break een statement van:
md5sumLocal.GetType().Fullname
md5sumRemote.GetType().FullName
Daar moet het verschil in zitten.
Beide van System.RuntimeType returnen "System.String".

Acties:
  • +1 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 16:47
Zou even een simpel testprogrammaatje maken om te proberen het probleem te isoleren. Dan kan je het desnoods hier ook delen als het niet werkt...
Zo word het verder een beetje gissen met geblurde hashes en functies die niet te zien zijn :)

Acties:
  • +1 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Het is dus inderdaad iets met de encoding.. Wel vreemd dat het voorheen wel werkte.

De strings zien er hetzlefde uit hebben dezelfde property maar de een is 64 chars en de ander 32. Die van 32 is juist .. De fout zit dus in de retMD5 functie.
Pfff het is gewoon veelste warm ik ga kapot binnen.

Acties:
  • +1 Henk 'm!

  • r_AllocStarByte
  • Registratie: Januari 2011
  • Laatst online: 16-07 13:34
Probleem was replace in md5 "-" met "".... Dit moest zijn string.empty...

Acties:
  • +1 Henk 'm!

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 14:25
Nou top dat het gevonden is!

*sowieso

Pagina: 1