Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-11-2010, 11:25   #1
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
[C] Convertire un file in un numero intero

Salve a tutti,

come da oggetto vorrei poter convertire un file qualsiasi in un numero intero. Per la trattazione degli interi utilizzo la libreria GMP, quindi posso trattare interi molto grandi. Qualcuno se la cosa sia fattibile?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 12:04   #2
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
Un file è una sequenze ordinata di bit quindi è già un numero (tipicamente enorme) espresso in base 2... tuttavia quello che credo tu stia cercando è una funzione hash.

ciao!

british
british è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 12:37   #3
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
magari qualche implementazione di md5

http://www.faqs.org/rfcs/rfc1321.html

Ultima modifica di tuccio` : 19-11-2010 alle 12:39.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 14:47   #4
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da british Guarda i messaggi
Un file è una sequenze ordinata di bit quindi è già un numero (tipicamente enorme) espresso in base 2...
Esatto. Ovviamente questo lo so bene, ed è proprio quel numero che vorrei ricavare.
Non voglio calcolare alcuna funzione di Hash, né SHA1, né MD5, che servono a tutt'altro. Mi serve sapere il file X corrisponde al numero Y. Stop. Mi serve un intero enorme, OK, anche in binario, ma posso (credo) sempre convertirlo in intero.

Grazie mille.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 14:58   #5
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Ho dato un'occhiata alla libreria GMP, visto che può trattare numeri arbitrariamente grandi si può fare a patto che la memoria sia sufficiente (quindi potrai ottenere un numero solo per file abbastanza piccoli).
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 15:01   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12869
Onestamente mi sembra un po' una follia. Il numero che cerchi potrebbe essere generato appunto dalla concatenazione dei numeri ASCII che rappresentano le lettere, il punto è che la grandezza di questo numero dipende strettamente dalla lunghezza della stringa.

Già una stringa di 80 caratteri vorrebbe dire mediamente un numero con 160 cifre, che è un NUMERO ENORME, immagina un file di qualche megabyte (1 milione di caratteri significherebbe un numero con in media 2 milioni di cifre).

Un hash SHA1 è un numero a 160bit, ovvero 20bytes, sai che la lunghezza sarà sempre quella e che la probabilità di collisione è comunque molto bassa.

Quindi un hash SHA1 in realtà è proprio quello che cerchi, per definizione di funzione di hash.

Poi bisognerebbe vedere esattamente cosa ci vorresti fare.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 15:24   #7
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
(quindi potrai ottenere un numero solo per file abbastanza piccoli).
Questa non è una cosa felice per me, anche se a dire il vero forse si può frammentare il file, e "procedere" a blocchi.

Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Onestamente mi sembra un po' una follia.
Lo so. Infatti detta così, non può sembrare altro che una follia, ma per scopi di ricerca, devo provare a crittografare dei file con la Homomorphic Encryption usando una libreria che però tratta interi. Questo tipo di crittografia ha alcune proprietà che a me interessano, e vorrei sfruttarle sui file.
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Già una stringa di 80 caratteri vorrebbe dire mediamente un numero con 160 cifre, che è un NUMERO ENORME, immagina un file di qualche megabyte (1 milione di caratteri significherebbe un numero con in media 2 milioni di cifre).
Finché la libreria GMP "regge", questo problema per il momento non mi preoccupa. I problemi potranno esserci dal momento in cui si applica la crittografia sul file.

Ecco perché dell'hash non me ne faccio nulla. O almeno credo, dal momento che facendo l'hash di un file, il risultato è una "stringa" ma rispetto al file ho perso informazioni, e non posso recuperare il file originario dato l'hash.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 17:49   #8
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12869
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
[..]
Ecco perché dell'hash non me ne faccio nulla. O almeno credo, dal momento che facendo l'hash di un file, il risultato è una "stringa" ma rispetto al file ho perso informazioni, e non posso recuperare il file originario dato l'hash.
L'hash di un file è un numero intero, la sua rappresentazione in esadecimale ti può confondere facendoti credere che sia una stringa .

Chiaramente l'hash non è reversibile (quantomeno facilmente).

Comunque stavo pensando che potresti ridurre di molto i dati (specialmente se parliamo di testo) usando qualche libreria per la compressione prima di calcolare il numero.

Potresti fare quanto segue:

- applichi un algoritmo di compressione a tua scelta
- calcoli la sequenza di caratteri ascii associata al file compresso e tiri fuori un numero relativemente grosso

a quel punto per tornare indietro basterebbe:

- ricreare il file compresso a partire dal numero
- decomprimere il file risultante

Una nota: sarebbe auspicabile normalizzare i codici ASCII così che siano tutti della stessa lunghezza.

Cerco di spiegarmi: come saprai l'ASCII standard prevede i caratteri dallo 0 al 126.

Questo significa che se ti trovi davanti a 2 caratteri (32 e 107 per esempio) quando costruisci il numero otterresti 32107.

Questo numero chiaramente può essere interpretato in diversi modi, ad esempio potrei associarlo ai caratteri 32, 10, 7 oppure a 3, 21, 07 e così via...

Per cui dovresti cercare di normalizzarli affinché il numero più alto e quello più basso che vuoi rappresentare siano di dimensione fissa, ad esempio se decidi di farli di 2 cifre bisognerebbe farli rientrare in un intervallo tra 10 e 99 (ovvero 89 caratteri utili, quindi hai delle limitazioni).

Usando sequenze di 3 numeri potresti mappare tutti i caratteri, tuttavia già solo con stringhe di 2 caratteri ti troveresti un numero con 6 cifre.

Ribadisco che ci vuole poco affinché una cosa del genere diventi ingestibile.

Ultima modifica di WarDuck : 19-11-2010 alle 17:52.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 17:57   #9
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
WarDuck: grazie. Oltre che estremamente chiaro, sei stato molto gentile. Apprezzo molto la tua risposta.

Quando parlavo di "stringa" (messa a posta tra virgolette), intendevo una quantità generica, ma hai fatto bene a puntualizzare.

La tua soluzione andrebbe anche bene, ma purtroppo non posso utilizzarla, perché lo scopo è quello di trattare qualsiasi tipo di file. Auspicabilmente di qualsiasi dimensione (entro certi limiti, ovviamente).

Il tuo post mi ha chiarito molte cose, e credo che dovrò riflettere bene sul da farsi perché quello che avevo in mente di fare comincia ad essere un po' problematico.

Grazie molte.

__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2010, 23:51   #10
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Scusa, mi stavo rifacendo un attimo due calcoli.
Tu hai scritto che "Già una stringa di 80 caratteri vorrebbe dire mediamente un numero con 160 cifre". Verissimo che hai detto "mediamente", ma volevo confrontarmi per vedere se i calcoli che ho fatto io siano giusti.

1 char = 1 byte = 8 bit
80 caratteri => 80x8 = 640bit
Quindi il numero massimo rappresentabile è 2^640 -1, ovvero circa 4*10^192, ovvero, 4 seguito da 192 zeri. Quindi un numero da 193 cifre. Giusto?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 00:00   #11
bobbytre
Senior Member
 
L'Avatar di bobbytre
 
Iscritto dal: Feb 2010
Messaggi: 466
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Scusa, mi stavo rifacendo un attimo due calcoli.
Tu hai scritto che "Già una stringa di 80 caratteri vorrebbe dire mediamente un numero con 160 cifre". Verissimo che hai detto "mediamente", ma volevo confrontarmi per vedere se i calcoli che ho fatto io siano giusti.

1 char = 1 byte = 8 bit
80 caratteri => 80x8 = 640bit
Quindi il numero massimo rappresentabile è 2^640 -1, ovvero circa 4*10^192, ovvero, 4 seguito da 192 zeri. Quindi un numero da 193 cifre. Giusto?
esatto , i tuoi calcoli sono corretti !
__________________
I robot hanno scintillanti fondoschiena metallici che non dovrebbero essere baciati.
bobbytre è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 00:11   #12
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Grazie per la conferma!
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 00:14   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12869
Mmm sarà l'ora ma non ho ben capito cosa intendiate...

Se ho una stringa tipo "ABCD", sono 4 byte, ovvero 4 caratteri.

Se ogni carattere ASCII lo rappresentassimo con 2 cifre (perché ad esempio abbiamo scelto di usare i numeri da 10 a 99), abbiamo un numero i cui simboli o cifre sono 8, ovvero il doppio.

Esempio:

A = 10
B = 11
C = 12
D = 13

ABCD (4 cifre) = 10111213 (8 cifre)

Per cifre intendo le cifre con cui viene rappresentato graficamente, non come viene rappresentato nel calcolatore, forse voi intendevate quest'ultima cosa?
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 00:23   #14
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Questa non è una cosa felice per me, anche se a dire il vero forse si può frammentare il file, e "procedere" a blocchi.
Penso sia la cosa migliore da fare, d'altra parte quasi tutti gli algoritmi di crittografia si applicano a blocchi secondo diversi schemi.
Ad ogni modo se consideri un file come una stringa di testo o come un intero il numero di bit che ti serve per rappresentare l'uno o l'altro non cambia. Non so come GMP rappresenti internamente gli interi ma meglio di così non può fare senza perdere informazioni (a meno che non comprima i dati ma ne dubito). Quindi quando dicevo che non potrai ottenere numeri da file troppo grandi intendevo dire che c'è un limite fisico che è quello della memoria.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 01:12   #15
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
devo provare a crittografare dei file con la Homomorphic Encryption usando una libreria che però tratta interi.
e tu hai già una libreria che la implementa? e ti serve un array di int o cosa? se tu avessi una funzione che prende un array di char, unsigned char o void ti basterebbe fare un file mapping, non dovresti fare proprio nulla

il problema è che se piglia un array di int e il file non è di dimensione multipla della dimensione del tipo int è un casino :/
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 08:51   #16
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
forse voi intendevate quest'ultima cosa?
Sì sì, io intendevo proprio quello, ovvero data la rappresentazione binaria su disco di quel file, ottengo l'intero.
La soluzione ASCII la devo per forza scartare, nel mio caso.

Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Non so come GMP rappresenti internamente gli interi
Si tratta di interi a precisione multipla ed il tipo di dato è un mpz_t, ed ecco la parte di codice in questione nel file /usr/include/gmp.h:
Codice:
typedef struct
{
  int _mp_alloc;		/* Number of *limbs* allocated and pointed
				   to by the _mp_d field.  */
  int _mp_size;			/* abs(_mp_size) is the number of limbs the
				   last field points to.  If _mp_size is
				   negative this is a negative number.  */
  mp_limb_t *_mp_d;		/* Pointer to the limbs.  */
} __mpz_struct;

#endif /* __GNU_MP__ */


typedef __mpz_struct MP_INT;    /* gmp 1 source compatibility */
typedef __mpz_struct mpz_t[1];
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Quindi quando dicevo che non potrai ottenere numeri da file troppo grandi intendevo dire che c'è un limite fisico che è quello della memoria.
Ok, certamente, in caso vedrò qual'è questo limite fisico e saprò fino a che punto potrò fare quello che mi serve.

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
e tu hai già una libreria che la implementa?
Sì, si chiama libpaillier, e funziona molto bene (provando con numeri interi).

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
se tu avessi una funzione che prende un array di char, unsigned char o void ti basterebbe fare un file mapping, non dovresti fare proprio nulla
Dunque, queste sono le tre funzioni che servono ad inizializzare il tipo di dato da cifrare:

Codice:
/*
  Allocate and initialize a paillier_plaintext_t from an unsigned long
  integer, an array of bytes, or a null terminated string.
*/
paillier_plaintext_t* paillier_plaintext_from_ui( unsigned long int x );
paillier_plaintext_t* paillier_plaintext_from_bytes( void* m, int len );
paillier_plaintext_t* paillier_plaintext_from_str( char* str );
Quindi in realtà potrei trattare il file come una stringa e provare a passargli quella. Però ancora non sono convinto.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 09:59   #17
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
probabilmente è più efficiente usare la versione long, perché hai 1/8 dei numeri.. però ti costringerebbe a fare un lavoro sui file.. e per file che superano la memoria messa a disposizione dall'os dovresti anche inventarti qualcosa per non tenere tutto in ram

con il mapping l'os fa tutto da solo

ps: dovresti usare la versione che prende void* non quella che prende char*

Ultima modifica di tuccio` : 20-11-2010 alle 10:01.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 10:06   #18
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
OK, grazie, ora mi metto a fare delle prove.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2010, 10:33   #19
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Confermo quanto detto fin'ora. Anche trasformando un file di pochi byte in un void*, il tipo di dato mpz, non riesce a contenere un intero corrispondente al contenuto del file:
gmp: overflow in mpz type
Aborted
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Gli sviluppatori di Genshin Impact hanno...
Poltronesofà colpita da ransomwar...
FSD e Autopilot: Tesla aggiorna i dati c...
Conclusa la campagna di osservazione del...
Il punto della situazione sulle offerte ...
Windows compie 40 anni, tra conquiste e ...
Black Friday Smartwatch: Amazfit, Apple,...
Operativo il primo Tesla Supercharger te...
Grok idolatra Elon Musk e lo considera s...
Il telescopio spaziale James Webb ha oss...
Record per l'energia eolica: nel Regno U...
Dell e HP rimuovono la codifica e transc...
Prezzo eccezionale per Samsung Galaxy S2...
Black Friday esplosivo: arrivano extra s...
Google apre la strada al file sharing tr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v