Newsgroup: it.comp.lang.delphi
Titolo: ID univoco da una stringa

Salve
Avrei bisogno di generare un id univoco di una stringa, mi spiego. Tramite
un'algoritmo generare un numero che puo' essere ricavato solo ed unicamente
tramite quella esatta stringa (sequenza di caratteri, lunghezza della
stringa, ecc..), insomma non deve accadere che da due stringhe diverse
possano uscire fuori due id uguali. Ho pensato al CRC32 ma non so se fa
quello che voglio io.
Suggerimenti, consigli?
Grazie a tutti!!!!!

Quello che tu vuoi realizzare si chiama indirizzamento hash.
In pratica si usa una funzione che dovrebbe restituire un codice univoco
corrispondente al parametro passato.
Non so dove prenderle, magari su qualche testo universitario.
Ricorda pero' che non mi sembra esista una formula con rapporto 1:1.
Infatti, l'indirizzamento hash include dei metodi per gestire le
"collisioni", ovvero, i casi in cui per due chiavi si ottiene lo stesso
risultato.
Qui poi si inizia a parlare di catene distinte, catene confluenti, area di
trabocci e altre parolacce di quetso tipo.
Una trattazione ben definita di quest'argomento lo puoi trovare su testi di
informatica di base per le scuole superiori (ITIS ind. informatica) per il
5' anno.
Saluti
AS
"Se è Microsoft non funziona"


Quello che vuoi fare e' impossibile, a meno di non imporre vincoli molto
restrittivi alla stringa in esame, tipo lunghezza massima, set di caratteri
utilizzabile, eccetera...
L'id univoco comunque sarebbe un numero molto grande, perche' dovrebbe
comprendere tutti i bit della stringa, a meno di non usare qualche algoritmo
di compressione "no loss", che pero' restituirebbe un valore di lunghezza
variabile...
Ciao,
Stefano

 ma non so se fa quello che voglio io. Suggerimenti, consigli?
non ho mai avuto a che fare con niente di simile, ma garantire
che ci sia un numero sempre diverso secondo me e' impossibile
stringa = array di byte = bits = numero
solo in questo caso "numero" sara' univoco in base a "stringa"
ad es. se vuoi che ti venga generato un numero di grandezza un byte
hai 256 possibili stringhe, una word 65536 ...
in realtà le  stringhe possibili sono pressoche' infinite,
o cmq molto maggiori
ti posso chiedere a csa ti serve,
e' un qualcosa di "reale", o solo a scopo di studio?
Ciao,
Alan Solo

 sia un numero sempre diverso secondo me e' impossibile
scusa, mi e' venuta un'idea (guardando il tuo messaggio)
fare un qualcosa tipo il CRC, trattare la stringa come numero
e dividerla per un numero noto a priori, usare il risultato
(o il resto come nel CRC, ma in questo caso potrebbe
non andar bene) come id
a questo punto il problema sorge sulle capacita' di calcolo
del calcolatore e sue approssimazioni, quindi anche la lunghezza
della stringa dovrebbe essere moto limitata,
boh e' solo un'idea..
Ciao,
Alan Solo

 corrispondente al parametro passato.
Ciao
Nei fantastici componenti HyperString c'e' gia' bella e pronta la funzione
Hash di cui riporto la descrizione nell'help:
Generate an integer hash key for the input string.
Returns:  32 bit +/- integer hash key, zero if null string
Note: This is a highly efficient, verified, general purpose hashing
algorithm based upon the published research of Peter J. Weinberger of AT&T
Bell Labs and others.  This implementation has been used for years in UNIX
object files.
CRC and Checksum routines can also be used for hashing purposes.
Pero' prima di utilizzare questa funzione devo studiare per bene se fa
quello che voglio che faccia.
Vado a spolverare qualche libro ;))
Grazie!!!!!!!!!!!!!!!!!!!!!!!!

 e' un qualcosa di "reale", o solo a scopo di studio?
Si di reale, devo trattare un certo tipo di dati (la mole e' impressionante)
e poter avere un id del genere mi velocizzerebbe di 1000 volte certi
processi.
Le stringhe in ogni caso difficilmente potranna superare i 1000 caratteri.
Saluti

 non andar bene) come id
Diciamo che sono maggiormente d'accordo con il tuo mex precedente (e con
quello di Stefano) ... bisogna ricordare che anche il CRC, in casi
particolari, non segnala errori.
Ciao!
--
- Carlo -
c.b...@libero.it

 particolari, non segnala errori.
se si usa il resto della divisione si', in alcuni casi gli errori
non potrebbero venir segnalati, ma ricordiamoci che cio' e' molto
improbabile, considerando che il CRC viene usato prevalentemte
per trasmisioni via rete, e in questi casi la possibilita' di farsi
sfuggire un errore e' molto improbabile.
Tuttavia nel caso del thread, come hai detto tu, questa soluzione
potrebbe (anzi direi sicuramente) non andar bene, io avevo proposto
di usare il risultato della divisione anziche' il resto,
non so quano sia fattibile, anche perche' il resto sara'
sicuramente minore del "numero noto a priori" usato per la divisione
mentre il quoziente no.
Cmq Sem riporta le descrizione di questi HyperString che utilizzano
una implementazione, la quale, da cio' che e' scritto, (.."usata per anni in
Unix"..) sembra qualcosa di affidabile, tuttavia non riesco a capire
come si possa ridurre in maniera univoca e sicura una stringa da 1000 byte
in una da 4, io resto del parere che cio' e' impossibile,
ma questo Weinberger sicuramente ne sapra' piu' di me! ;)
Ciao! :)
Alan

 ma questo Weinberger sicuramente ne sapra' piu' di me! ;)
Probabile ... ma non ci giurerei! :)



Non credo che questo Weinberger ne sappia + di te a tal punto da comprimere
una stringa di 1000 byte in un intero a 32 bit, altrimenti sarebbe ricco
:-))
Ciao,
Stefano