2012-03-30 13 views
11

Il requisito:algoritmo per la generazione di un codice univoco (costante) per una stringa che dovrebbe essere reversibile

Abbiamo valori nel DB come

Chennai 
Baroda 
Bangalore 
New Delhi 
São Paulo, Lisboa 
San Jose 

ecc ...

quindi voglio per convertire queste stringhe in una stringa breve unica. Ad esempio

Chennai –> xy67kr 

San Jose –> iuj73d 

in pratica qualcosa di simile a URL shortner.

E l'algoritmo per convertire questo dovrebbe essere reversibile .. cioè quando passo "xy67kr" a una funzione di decodifica dovrebbe restituirmi "Chennai".

In cerca di aiuto.

+0

Le stringhe devono essere di lunghezza fissa? –

+1

Se si dispone di un database, l'elaborazione dell'inversione dovrebbe essere piuttosto semplice ... –

+0

1 - Le stringhe non hanno una lunghezza fissa. Lunghezza massima = 200 caratteri 2 - Voglio evitare la chiamata DB. Questa è la ragione per cui voglio generare un algoritmo. Quale può essere usato in DB per codificare le stringhe. Lo stesso algoritmo può essere usato per decodificare e ottenere un valore reale nella mia applicazione web – Taher

risposta

4

Come altri posters hanno dichiarato, non è possibile avere una funzione che accorcia le stringhe arbitrarie, che è matematicamente impossibile. Ma puoi creare una funzione personalizzata che funzioni bene con il tuo particolare set di stringhe.

Un approccio esempio sarebbe calcolare la frequenza carattere nel set, poi solo codificare i caratteri con un prefix code tale che le lettere più frequenti sono codificati con brevi prefissi (cioè Huffman coding.)

Tale approccio fa non approfittare del fatto che nel linguaggio naturale il prossimo personaggio può essere predetto in modo abbastanza accurato da quelli precedenti, quindi è possibile estendere l'algoritmo di cui sopra in modo che invece di codificare i caratteri in modo indipendente, codifichi il prossimo carattere in un n-grammo. Ciò richiede ovviamente una tabella di compressione più grande rispetto all'approccio semplice, dal momento che si sta effettivamente avendo un codice separato in base al prefisso. Ad esempio se 'e' è molto frequente dopo 'th', quindi 'e' dopo 'th' è codificato con un prefisso molto breve. Se 'e' è molto raro dopo 'ee', allora in questo caso può essere codificato con un prefisso molto lungo. L'algoritmo di decodifica ha ovviamente bisogno di guardare il prefisso attualmente decompresso per verificare come decodificare il prossimo carattere.

Questo approccio generale presuppone che le frequenze non cambino o almeno cambino lentamente. Se il tuo set di dati cambia rispetto a quello che potresti dover ricalcolare le statistiche e ricodificare le stringhe.

+0

Dubito che ciò funzioni bene per i dati di input brevi. Sembra anche che l'OP desideri una codifica a lunghezza fissa, il che è chiaramente impossibile. –

+0

@OliCharlesworth Al contrario, questo tipo di codifica statistica funziona bene anche per le stringhe di carattere singolo, salvo il fatto che anche se il codice risultante è di 6 bit, allora devi ancora inviare (o salvare) almeno un byte . Sono d'accordo che la codifica a lunghezza fissa è impossibile. –

+0

Ok, nella mia domanda iniziale ho chiesto che le mie stringhe di input possano essere di lunghezza variabile. Quindi, supponiamo di renderli di lunghezza fissa applicando il padding, i.e -> New York [diventa] -> New York! @ !! @! o qualcosa di simile. È possibile quindi accorciarli dopo la codifica? – Taher

4

Vedi my answer alla domanda simile, e solo riscriverlo a PHP:

Encoding:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa")) 

decodifica:

$decoded = gzinflate(base64_decode($encoded)) 

Nota che gzdeflate si comporta meglio di gzcompress su brevi stringhe.

Ma in ogni caso il problema è che per le stringhe brevi rende la stringa più lunga. Questo funziona meglio su testi più lunghi. Ovviamente sarebbe meglio utilizzare un algoritmo di compressione con informazioni a priori, come il metodo ppm o suffisso con albero di suffisso iniziale ... quindi funzionerebbe perfettamente anche su stringhe corte.

+0

Sì, penso che il punto sia che questo non aiuterà l'OP. –

+0

Sarebbe ovviamente meglio usare qualche ** algoritmo di compressione con informazioni a priori **, come il metodo ppm o suffisso con albero di suffisso iniziale ... quindi funzionerebbe perfettamente anche su stringhe corte. Ma la domanda è se questi metodi sono accessibili all'interno di PHP. – TMS

+0

Sto lavorando con C#, non con PHP :) – Taher

3

Non è possibile accorciare le stringhe di lunghezza arbitraria a una lunghezza fissa.

Che cosa è possibile fare è creare quelle stringhe corte per l'ID univoco della riga di quella stringa specifica nel database. Ecco alcuni suggerimenti: How to design a sequential hash-like function.

1

Questo non è necessariamente deterministico, ma ovviamente è possibile utilizzare una tabella di ricerca. Il servizio sarebbe simile a goo.gl o imgur

Problemi correlati