Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Omzetting c++-hash-algoritme naar vb.net

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik zou een stukje c++-code moeten omzetten naae vb.net.... en mijn c++-kennis zit op dit moment ver weg. Het is een algoritme gestuurd met pointers, dus zie ik de omzetting naar vb.net niet echt zitten.

Heeft iemand suggesties ? is het eigenlijk mogelijk ?

code:
1
2
3
4
5
6
7
unsigned int subhashb(const unsigned char *s,long len) {
  unsigned long h;
  h = 5381;
  while (len-- > 0)
    h = (h + (h << 5)) ^ (unsigned int)*s++;
  return h % 53;
}

  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:51

beany

Meeheheheheh

Er gebeuren hier geen hele rare dingen hoor... dit moet je zelf heel eenvoudig kunnen omzetten.

En wat heb je zelf al geproduceerd? Waar loop je vast? Zomaar stukje C++ code neerkwakken en hopen dat iemand het verteld is niet de manier om hier een topic te openen...

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 18:34

BCC

De pointers lijken mij hier sowieso geen enkel probleem.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Verwijderd

Topicstarter
Dit heb ik al...
regeltje 10 doet me de das om...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim h As Long
        Dim len As Integer
        Dim s As String
        h = 5381

        s = Me.dfsEmail.Text
        len = Me.dfsEmail.Text.Length

        While len > 0
            'h = (h + (h << 5)) ^ Int(s + 1)
            len = len - 1
        End While

        Me.dfsHash.Text = h Mod 53

[ Voor 4% gewijzigd door Verwijderd op 23-10-2007 09:55 ]


  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:51

beany

Meeheheheheh

Je hebt een regel geremarked staan
'h = (h + (h << 5)) ^ Int(s + 1)
je probleem zit dus daar ergens vermoed ik. Wat is precies je probleem met die regel?

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Verwijderd

Topicstarter
ik krijg dat regeltje niet goed omgezet naar vb.net-code...

Zoals ik al zei is het 10 jaar geleden dat ik nog iets in c++ gedaan heb..

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 18:34

BCC

Mag je in vb.net 1 bij een string optellen? Zo ja, krijg je dan niet "string1" ? of een type error? In ieder geval iets anders dan de char waarde +1?

[ Voor 20% gewijzigd door BCC op 23-10-2007 09:56 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Verwijderd

Topicstarter
hoe interpreteer ik "(unsigned int)*s++;" best naar vb.net ?

  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:51

beany

Meeheheheheh

(unsigned int)*s++; is gelijk aan: s[teller++]

Dus gewoon de string s met een tellertje byte voor byte uitlezen.

Alleen in C++ wordt de pointer naar s opgehoogd, in VB.Net zal je een aparte teller ervoor moeten gebruiken. Je kan de variabele len niet gebruiken, omdat die aftellend is en het algoritme de string oplopend door moet lopen.

[ Voor 49% gewijzigd door beany op 23-10-2007 10:00 ]

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Als ik het goed heb, worden hier de pointers gebruikt om een var buiten de functie aan te passen. Als dat klopt, dan moet je in plaats van ByValue, ByRefference meegeven.

En dan wordt het s+=1

  • whoami
  • Registratie: December 2000
  • Nu online
Hmmm.... Zoals dit topic hier nu staat, lijkt het wel alsof je wil dat iemand anders zomaar die regel code voor jou geeft. Dat is hier eigenlijk niet de bedoeling.

Volgens mij ga je met die regel een character uit je string halen, en daar de ASCII waarde van ophalen. Die ++ zorgt er dan voor dat je de volgende keer het volgende character er uit haalt.
Volgens mij ga je dus gewoon ieder character uit die string gaan halen, en van ieder character dus de ASCII waarde gaan ophalen.

edit: wat beany dus zegt; sneller leren typen.

[ Voor 4% gewijzigd door whoami op 23-10-2007 10:02 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
zoiets dan ?
volgens mij krijg ik dan nog steeds een type-error in diezelfde regel... niet ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        Dim h As Long
        Dim len, i As Integer
        Dim s As String
        h = 5381

        s = Me.dfsEmail.Text
        len = Me.dfsEmail.Text.Length

        While len > 0
            h = (h + (h << 5)) ^ Mid(s, i, 1)
            i = i + 1
            len = len - 1
        End While

        Me.dfsHash.Text = h Mod 53

        Me.dfsHash.Text = (Me.dfsEmail.Text.GetHashCode Mod 53) * -1

    End Sub

  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:51

beany

Meeheheheheh

compufreak88 schreef op dinsdag 23 oktober 2007 @ 10:01:
Als ik het goed heb, worden hier de pointers gebruikt om een var buiten de functie aan te passen. Als dat klopt, dan moet je in plaats van ByValue, ByRefference meegeven.

En dan wordt het s+=1
Negeer deze post aub! Het gaat om de waarde die terug gegeven wordt, niet om de pointer. De pointer is alleen een manier om een string byte voor byte uit te lezen. Daarbij komt ook nog eens dat die pointer als een CONST wordt meegegeven. Wijzigen van de data op de locatie van de pointer is dus duidelijk niet de bedoeling. ByReference doet er dus totaal niet toe!

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Verwijderd

Topicstarter
dus als ik alles goed doorheb, zou ik dit moeten doen :
code:
1
2
3
4
5
While len > 0
            h = (h + (h << 5)) ^ Asc(s.Chars(i))
            i = i + 1
            len = len - 1
End While

  • whoami
  • Registratie: December 2000
  • Nu online
Waarom ga je 2 tellers gaan gebruiken ?
Waarom niet gewoon i gebruiken en van 0 tot length - 1 gaan loopen ?

Waarom gebruik je die Mid functie ? Je kan ook gewoon die string als een array van characters beschouwen, en dus gebruik maken van de subscript operator.
Je zal het resultaat van die MId nog moeten casten naar een integer value.

https://fgheysels.github.io/


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Verwijderd schreef op dinsdag 23 oktober 2007 @ 10:03:
zoiets dan ?
volgens mij krijg ik dan nog steeds een type-error in diezelfde regel... niet ?
code:
1
            h = (h + (h << 5)) ^ Mid(s, i, 1)
moet worden:
code:
1
            h = (h + (h << 5)) ^ ord(Mid(s, i, 1))


Het gaat om de getalswaarde van de byte op positie i.

  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:51

beany

Meeheheheheh

Ord kent VB geloof ik niet. Asc(s.Chars(i)) is ok! Zoals ie daar staat is het goed.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Verwijderd

Topicstarter
als ik volgende code gebruik krijg ik wel een "arithmatic overflow"...
code:
1
h = (h + (h << 5)) ^ Asc(s(i))

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

dim h as System.UInt64

(= Unsigned long)

If it isn't broken, fix it until it is..


  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
http://www.codeproject.com/csharp/overflow_checking.asp

Kijk daar eens naar. Er is vast ook een unchecked statement voor VB.NET.

Ow, en in je originele code is h een unsigned long, en in jouw code signed. Let daar ook nog even op.

[ Voor 0% gewijzigd door __fred__ op 23-10-2007 10:29 . Reden: Spuit elf ]


Verwijderd

Topicstarter
ik voel me ineens extreem dom worden...
maar ik kom verder ...
code:
1
h = (h + (h << 5)) Xor Asc(s(i))


ik vermoed echter dat die Asc toch niet 100% juist is

[ Voor 62% gewijzigd door Verwijderd op 23-10-2007 10:51 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
de "Or" operator die je gebruikt is volgens mij niet gelijk aan de ^ operator wat een XOR operator is.

edit:

Ow je hebt het net aangepast ;)


Waarom denk je dat asc niet goed is?

[ Voor 32% gewijzigd door Woy op 23-10-2007 10:54 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:09
Or is geen ^, dat is een Xor! Die is wel erg belangrijk voor hashing.

En ik weet niet hoe het zit met VB, maar C++ negeert overflows gewoon. Hier wordt juist gebruik van gemaakt met de optelling van h en h << 5. Kan dit in VB ook uitgezet worden?

Asc geeft trouwens gewoon de ascii waarde terug van de eerste character, wat wel juist is.

Trouwens: nog wat meer informatie over hashing vind je bijvoorbeeld hier. Daar staan ook een aantal hele goede hash functies in (die ik zelf ook meerdere malen heb gebruikt).

[ Voor 38% gewijzigd door Marcj op 23-10-2007 10:56 ]


  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
Ik zie trouwens net dat VB.NET geen unchecked / checked statements heeft. (Hoera voor C#)

je kunt in de project properties "Remove Integer Overflow Checks" aanvinken. Dat doet hetzelfde.

Verwijderd

Topicstarter
probleem is dat ik deze hash-functie meot gebruiken van mijn provider...
maar zij krijgen het blijkbaar ook niet vertaald naar vb.net

ik kom via jullie toch al stukken verder ... alvast bedankt

nu nog tot de oplossing komen

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je die hash functie moet gebruiken dan staat er vast ook wel ergens beschreven hoe hij vast werkt. Ik kan me niet voorstellen dat je een stukje code krijgt en dat ze dan zeggen dat je die hash moet gebruiken. Het lijkt me dat dat gespecificeerd is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:09
Ik vond het heel raar dat de hash-functie maar 53 mogelijke waardes kan returnen. Dat zit niet echt in de buurt van een twee-macht (wat meestal gebruikt wordt).

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:35

Janoz

Moderator Devschuur®

!litemod

Voor een goede hash is het juist uitermate belangrijk om zo ver mogelijk van een 2 macht te blijven. Het is zeer aan te raden om hiervoor een priemgetal te gebruiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:09
Klopt, maar je hebt ook wel priemgetallen in de buurt van een 2-macht ;) (bijvoorbeeld 251, of 65521, of 4294967291).

En de Jenskins hash werkt gewoon op 2-machten en werkt perfect, en snel!

offtopic:
Ben met afstuderen nogal bezig geweest met hash-functies...

[ Voor 25% gewijzigd door Marcj op 23-10-2007 11:14 ]


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
beany schreef op dinsdag 23 oktober 2007 @ 10:05:
[...]

Negeer deze post aub! Het gaat om de waarde die terug gegeven wordt, niet om de pointer. De pointer is alleen een manier om een string byte voor byte uit te lezen. Daarbij komt ook nog eens dat die pointer als een CONST wordt meegegeven. Wijzigen van de data op de locatie van de pointer is dus duidelijk niet de bedoeling. ByReference doet er dus totaal niet toe!
Ok, dan had ik het verkeerd begrepen. Ik ben niet echt goed in c++.

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op dinsdag 23 oktober 2007 @ 10:58:
probleem is dat ik deze hash-functie meot gebruiken van mijn provider...
maar zij krijgen het blijkbaar ook niet vertaald naar vb.net

ik kom via jullie toch al stukken verder ... alvast bedankt

nu nog tot de oplossing komen
Kan je dan niet beter gewoon die C++ functie in een aparte dll gieten (gewoon, in c++ laten dus), en dan die dll gaan gebruiken (dllimport etc)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik heb nu het volgende, zonder overflows...
Toch geeft dit nog niet het gewenste resultaat als ik controleer met de testwaarden.

ziet er nog iemand een foutje staan ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Dim h As System.UInt64
        Dim len, i As Long
        Dim s As String

        h = 5381
        s = Me.dfsAdmin.Text
        len = Me.dfsAdmin.Text.Length
   
        While len > 0

            h = (h + (h << 5)) Xor Asc(s(i))
            i = i + 1
            len = len - 1
        End While

        MsgBox(h Mod 53)

[ Voor 3% gewijzigd door Verwijderd op 23-10-2007 11:55 ]


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 18:34

BCC

Verwijderd schreef op dinsdag 23 oktober 2007 @ 10:58:
probleem is dat ik deze hash-functie meot gebruiken van mijn provider...
maar zij krijgen het blijkbaar ook niet vertaald naar vb.net

ik kom via jullie toch al stukken verder ... alvast bedankt

nu nog tot de oplossing komen
Heb je ook een testset?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:09
Waarom heb je niet gewoon een for-lus met i van 0 tot len? Nu heb je twee counters, wat een beetje overbodig is.

Verwijderd

Topicstarter
testset :
a@a.com - hash : 44
b@b.com - hash : 13

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet dus gewoon even debuggen. Als je geen specificatie van het hash algoritme hebt maar alleen c++ code zul je daar even door heen moeten stappen en per stap controleren of het resultaat hetzelfde is als je VB.NET code.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
op dit toestel geen c++-compiler :'(

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
downloaden?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
dat zal voor deze nacht dan zijn...

vreemd dat ik het verschil niet zie tussen de 2 codes....

  • Marcj
  • Registratie: November 2000
  • Laatst online: 17:09
Dit is nog niet zo moeilijk met de hand te doen, voor "a@a.com":

a@a.com -> [97,64,97,46,99,111,109]

h = 33 * 5381 ^ 97 = 177604
h = 33 * 177604 ^ 64 = 5860868
h = 33 * 5860868 ^ 97 = 193408741
...
h = 229367488999050 % 53 = 10 ?? Ik heb vast een rekenfout gemaakt :P

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Dim h As ULong = 5381
For i As Long = 0 To Len(str)
h = (h + (h << 5)) ^ Asc(str.Substring(i, 1))
Next
Return h Mod 53

Dit maak ik er van, alleen hij geeft steeds overflow exception.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Je VB code is niet gelijk aan de C code omdat een long eigenlijk modulo 2^32 werkt.

"He took a duck in the face at two hundred and fifty knots."


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
compufreak88 schreef op dinsdag 23 oktober 2007 @ 13:25:
Dim h As ULong = 5381
For i As Long = 0 To Len(str)
h = (h + (h << 5)) ^ Asc(str.Substring(i, 1))
Next
Return h Mod 53

Dit maak ik er van, alleen hij geeft steeds overflow exception.
Als je eerst de bovenste 5 bits maskeert voordat je schuift gebeurt dat niet meer.

Visual Basic .NET:
1
h = (h + ( ( h & 0x07FFFFFF ) << 5))) ^ Asc(str.Substring(i, 1))


edit

Erm en dan nog de optelling wegwerken dus .... pfff VB sux0rs nog steeds

[ Voor 16% gewijzigd door farlane op 23-10-2007 15:33 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 18:34

BCC

Ben ik de enige die zich afvraagt waarom je een email adres zo omslachtig wil hashen?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
BCC schreef op dinsdag 23 oktober 2007 @ 16:20:
Ben ik de enige die zich afvraagt waarom je een email adres zo omslachtig wil hashen?
Verwijderd schreef op dinsdag 23 oktober 2007 @ 10:58:
probleem is dat ik deze hash-functie meot gebruiken van mijn provider...
[..]

  • whoami
  • Registratie: December 2000
  • Nu online
Kan je, zoals ik al zei, die hash functie niet in C++ houden. Deze in een C++ DLL bakken, en dan mbhv DLLImport deze aanroepen ?

https://fgheysels.github.io/


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ben ik de enige die zich afvraagt waarom een provider een email adres zo omslachtig wil hashen? B)

{signature}


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:17
Ben ik de enige die zich afvraagt waarom je VB.Net zou gaan gebruiken als je ook C# hebt? :P

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Uiteindelijk de oplossing gevonden....

Bedankt voor alle suggesties...
Oplossing :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        Dim h As System.UInt64
        Dim len, i As Long
        Dim s As String

        h = 5381
        s = Me.dfsEmail1.Text
        len = Me.dfsEmail1.Text.Length
        i = 0
        While len > 0
            h = CUInt(CUInt(h) + (CUInt(h) << 5)) Xor Asc(s(i))
            i = i + 1
            len = len - 1
        End While

        MsgBox(h Mod 53)

  • whoami
  • Registratie: December 2000
  • Nu online
En dan blijf ik me afvragen waarom je met 2 tellers werkt ... (len en i ).

https://fgheysels.github.io/


Verwijderd

Topicstarter
die 2e teller was om te debuggen...
in de eigenlijke code is deze uitgeschakeld
Pagina: 1