Max1414 Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 Witam! Potrzebuję zamienić string na liczbę tzn. chcę z np. "Ala ma kota" zrobić jakiś hash w postaci liczby. Znalazłem kodzik hashowania haseł gg: function Hash(S: string): Cardinal; var x, y, z, i : Cardinal; begin y := 5; x := 0; for i := 1 to Length(S) do begin x := (x and $ffffff00) or Ord(S[i]); y := y xor x; Inc(y, x); x := x shl 8; y := y xor x; x := x shl 8; Dec(y, x); x := x shl 8; y := y xor x; z := y and $1f; y := (y shl z) or (y shr (32 - z)); end; Hash := y; end; Tylko, że wychodzi mi poza zakres (wywala error 201)... przypuszczam, że dlatego, że w pascalu string ma tylko max 255 znakow, a kod byl pod delphi. Nie rozumiem za bardzo tego kodu, więc mógłby mi ktoś pomóc co tu mam zmienić, aby mi to działało? i jeszcze nie jestem pewny co ma być w zmiennej 'y' , standardowo byl to parametr "Seed", chodzi mi tylko, żebym zahashował string i przedstawił w postaci liczby i żebym potem mógł porównywać te hashe. z góry dzieki Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Force Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 Użyć freepascala do kompilacji albo tablice charów zamiast stringa albo debugować Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Październik 25, 2009 Autor Zgłoś Share Napisano Październik 25, 2009 używam freepascala do kompilacji i w nim musi byc to skompilowane. To co mam zrobić? Zamienić parametr ze string na array of char i to wszystko? Bo mi nadal wywala 201 po Dec(y, x); Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 nie wydaje mi sie aby to byl blad stringa. Przy hashowaniu nastepuje "przekrecenie" zakresu, podejrzewam ze 201 jest kodem overflow, poszukaj w switchach kompilatora czy da sie wylaczyc range checka lub czegos z overflowem. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Październik 25, 2009 Autor Zgłoś Share Napisano Październik 25, 2009 dzieki force faktycznie był błąd z tym range check error... ale okazało się, że to hashowanie może generować dla różnych danych takie same hashe co mi nie odpowiada. Zna ktoś może jak najprostsze hashowanie? (zeby jak najmniej kodu zajmowalo?) chodzi mi tylko, żeby stringa zamienił na jakąś sygnaturkę dla niego w postaci LICZBY(!). Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 jak sama nazwa wskazuje hash jest skrotem, wiec jak robisz skrot z duzej ilosci danych to okazuje sie ze dla kilku roznych danych wejsciowych skrot jest taki sam o ile sie nie myle nazwya sie to kolizja hashy (ale moge sie mylic). Najlatwiejszy hash jaki mi przychodzi do glowy to suma elementow skladowych. albo xor tego co masz z kolejnym elementem i rolowanie tego w ktoras tam strone. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Force Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 Tylko czemu mi dziękujesz ? Baza tysięcy lotnisk: http://airportsbase.com Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Październik 25, 2009 Autor Zgłoś Share Napisano Październik 25, 2009 Tylko czemu mi dziękujesz ? Pomyliły mi sie nicki xDDD miało być Toster:D @Toster: no suma to raczej odpada, bo dodawanie jest przemienne, wiec będzie sporo kolizji : ] Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Październik 25, 2009 Zgłoś Share Napisano Październik 25, 2009 java uzywa takiego hasha do stringow, raczej prosty int h = 0; int off = offset; char val[] = value; int len = count; for (int i = 0; i h = 31*h + val[off++]; } val[] to tablica znakow Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.