PDA

View Full Version : problemino Java e numeri


arcer
09-08-2007, 15:12
salve a tutti ragazzi devo implementare l'sha-1 in java(so che esiste gia la classe ma la prof lo vuole implementato).Stando alle specifiche tecniche del NIST http://www.itl.nist.gov/fipspubs/fip180-1.htm si lavora con numeri a 32bit (i nostri cari int sono piu che sufficenti), il mio problema è che quando seguo l'algoritmo ci sono delle somme, ed essendo che si lavora con numeri molto grandi ci sono overflow a non finire e quindi al primo overflow si sballano tutte le altre somme, allora mi sono detto devo lavarare con valori unsigned, solo che il nostro caro java non ha valori unsigned.....come fare?

se implemento una specie di somma binaria guardando la configurazione dei bit?

mi era pure venuto in mente di scrivermi la funzione in C(che ha i valori unsigned) e portarmela dentro java con i metodi native(solo che non ho idea di come si faccia)....




grazie a tutti :P

Mixmar
09-08-2007, 15:20
Forse non è un'idea particolarmente brillante od originale ma... hai pensato di usare i long al posto degli int, anche solo per le somme?

arcer
09-08-2007, 15:24
Forse non è un'idea particolarmente brillante od originale ma... hai pensato di usare i long al posto degli int, anche solo per le somme?

gia fatto ma è sempre la stessa storia:muro: ....si arriva sempre ad overflow e se faccio stampare i valori esadecimali trovo fffffffffffbf36ae2 ad esempio (il numero è scritto a uccello di cane):mc:

Mixmar
09-08-2007, 15:30
Mi sembra strano che sommando (due) numeri a 32 bit si arrivi ad un numero più grande di 64 bit? :wtf:

andbin
09-08-2007, 15:32
il mio problema è che quando seguo l'algoritmo ci sono delle somme, ed essendo che si lavora con numeri molto grandi ci sono overflow a non finire e quindi al primo overflow si sballano tutte le altre somme, allora mi sono detto devo lavarare con valori unsigned, solo che il nostro caro java non ha valori unsigned.....come fare?Sto guardando adesso una implementazione fatta in C. Non mi sembra che gli freghi qualcosa dell'overflow.

Poi per quanto riguarda il signed/unsigned dovrebbe essere indifferente. Chiaramente se usi valori signed (in Java) e fai ad esempio conversioni da byte a int, devi stare attento, così come agli shift a destra. In Java devi usare >>> e non >>.

Per il resto basta che "segui" una implementazione fatta in C.

arcer
09-08-2007, 15:34
Sto guardando adesso una implementazione fatta in C. Non mi sembra che gli freghi qualcosa dell'overflow.

Poi per quanto riguarda il signed/unsigned dovrebbe essere indifferente. Chiaramente se usi valori signed (in Java) e fai ad esempio conversioni da byte a int, devi stare attento, così come agli shift a destra. In Java devi usare >>> e non >>.

Per il resto basta che "segui" una implementazione fatta in C.

ho due domande
1 perche devo usare >>> e non >>?(stai parlando solo degli shift a destra?)
2 passami l'implementazione in C plz :ciapet:





EDIT:




GRANDISSIMI ....dovevo usare >>> però non sapevo di questo operatore lol :| fa uno shift a destra mettendo a sinistra solo 0? perche ho l'impressione che >> a sinistra metta degli 1....che poi sono un'idiota perche anche se ci sono overflow i bit sempre quelli restano...

andbin
09-08-2007, 15:56
1 perche devo usare >>> e non >>?(stai parlando solo degli shift a destra?)>> fa un "signed" shift a destra, >>> fa un "unsigned" shift a destra.

Nel primo caso rimette nel bit più alto il segno (quello che era ... 0 o 1), nel secondo caso mette sempre 0 nel bit più alto.

2 passami l'implementazione in C plzLa trovi dappertutto. :D sulla RFC originale, in siti vari, ecc...

http://en.wikipedia.org/wiki/SHA_hash_functions