Autore Topic: Calcolare checksum  (Letto 2933 volte)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 266
    • Mostra profilo
Calcolare checksum
« il: 15 Novembre 2010, 20:22:54 »
Visto che gb.crypt mi da' dei problemi, nessuno mi da' l'idea per fare un checksum veloce di un file? Per veloce intendo come tempo (e che funzioni sia su testo che binario), non mi importa se una volta su 1000 mi da' una collisione...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Calcolare checksum
« Risposta #1 il: 15 Novembre 2010, 21:18:21 »
gb.crypt contiene l'MD5 che non è propriamente un algoritmo di cheksum ma di hash.

A parte questo la velocità dipende da diversi fattori, non ultimi la lunghezza dei dati e la lunghezza e sicurezza dell'hash in uscita. Personalmente ho sviluppato un paio di classi crittografiche in Gambas che calcolano l'MD5 e l'SHA256 ma, ora, non posso passartele perché non sono a casa.
S

Posso suggerirti di lanciare da terminale md5sum, un piccolo programmino (è presente nei repo di tutte le distro) che fa il suo compito rapidamente e semplicemente.
Oppure di provare a calcolarti il CRC32, un semplice algoritmo di checksum non difficile da reperire anche su internet (tipo questo codice). Ricordati dei tipi di dato, quando converti da C: il C prevede l'unsigned integer, che Gambas non ha.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 266
    • Mostra profilo
Re: Calcolare checksum
« Risposta #2 il: 16 Novembre 2010, 23:23:27 »
gb.crypt contiene l'MD5 che non è propriamente un algoritmo di cheksum ma di hash.

Certo: alla fine, in pratica ero semplicemente a volere controllare se due file sono uguali (mi serve per il programmino testi > sito web di cui parlavo qualche tempo fa, non volevo ricreare il file nuovo, se uguale, dato che poi sarebbe riuppato verso il sito, anche se uguale, se la data e' maggiore). Calcolare l'hash anziche' il checksum derivava solo dal fatto che in gb.crypt c'era gia' fatto :-) Purtroppo (non so se succede solo a me, a tutti, o se mi manca di reinizializzare qualcosa, indaghero', a file diversi corrispondono hash diversi, ma solo per qualche prova: poi inizia immancabilmente a ritornarmi il solito valore, a parita' di routine. Provero' (non ci avevo pensato) il crc32, nel frattempo mi sono attrezzato con una semplice lettura binaria dove comparo i due file a blocchi...

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Calcolare checksum
« Risposta #3 il: 17 Novembre 2010, 18:45:11 »
Tanto per far inviperire cesko  e visto che non ti 'frega' della collisione:

DIM sCheckVecchioFile as string
DIM sCheckNuovoFile as string

SHELL "md5sum " & path_file_vecchio & "  | cut -f1 -d' '" TO sCheckVecchioFile
SHELL "md5sum " & path_file_nuovo & "  | cut -f1 -d' '" TO sCheckNuovoFile

poi controlli le due stringhe.

ciao

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 266
    • Mostra profilo
Re: Calcolare checksum
« Risposta #4 il: 17 Novembre 2010, 20:07:30 »
Tanto per far inviperire cesko  e visto che non ti 'frega' della collisione:

Provo anche cosi', anche se shellare non mi appassiona troppo... ora nel fine settimana provo. Attualmente faccio cosi':

Codice: [Seleziona]
PUBLIC FUNCTION CompareFiles(snew AS String, sold AS String) AS Boolean
  DIM file1, file2 AS stream
  DIM s1, s2 AS String 
  DIM res AS Boolean
 
  res = TRUE
 
  IF Stat(snew).size <> Stat(sold).Size THEN
      res = FALSE
   ENDIF
 
    IF res = TRUE THEN   
   
        file1 = OPEN snew FOR READ
        file2 = OPEN sold FOR READ
       
       DO
        '2048 e' un valore di prova, che cambiero' a seconda dei test
        READ #file1, s1, -2048
        READ #file2, s2, -2048
          IF s1 <> s2 THEN
            res = FALSE
            BREAK
         ENDIF
        IF Len(s1) <> 2048 THEN BREAK
        LOOP
       
          CLOSE #file1
          CLOSE #file2
   ENDIF
     
  RETURN res
END

La cosa che mi da' fastidio di cio' e' il fatto di dovere fare una funzione apposita, quella che mi piace e' invece il fatto che mi risparmio un componente...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Calcolare checksum
« Risposta #5 il: 17 Novembre 2010, 22:28:06 »
Girellando sulla Wiki ho trovato questa funzione in C++ sulla Wiki francese:
Codice: c++ [Seleziona]
unsigned long hash(unsigned char *str)
{
unsigned long hash = 5381;
while(*str!='\0') {
        int c = *str;
                /* hash = hash*33 + c */
                hash = ((hash << 5) + hash) + c;
                str++;
        }
return hash;
}


E' la funzione di hash di Bernstein, una delle più semplici. Non dovrebbe essere un grosso problema adattarla in Gambas e farci un piccolo algoritmo di checksum.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 266
    • Mostra profilo
Re: Calcolare checksum
« Risposta #6 il: 18 Novembre 2010, 00:02:46 »
E' la funzione di hash di Bernstein, una delle più semplici. Non dovrebbe essere un grosso problema adattarla in Gambas e farci un piccolo algoritmo di checksum.

Provo anche questo (mi piace appunto il modo che non coinvolge shell o componenti, si capisce che usavo VB una volta?), temo pero' che dovendomi ripetere su file di 3 o 400 k probabilmente vado fuori tempo massimo :-)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Calcolare checksum
« Risposta #7 il: 18 Novembre 2010, 06:37:10 »
Il limite dei checksum è appunto che devono eseguire calcoli su tutti i dati e che dipendono quindi dalla dimensione del file. Ecco perché il consiglio comune (anche il mio, vedi la mia prima risposta) è stata quella di usare md5sum che, essendo un eseguibile compilato da C, è sicuramente più veloce di qualunque routine in Gambas che puoi scrivere: considera che quel programmino calcola l'MD5 di una ISO di un CD (700 MB) in pochi secondi...
Visita il mio sito personale: http://www.leonardomiliani.com