Converti la stringa di versione in intero

8

Devo essere in grado di convertire una stringa di versione in un numero intero. Ho deciso che seguirò versioning semantico in modo che le stringhe di versione siano del tipo x.y.z .

Inizialmente pensavo che un semplice algoritmo come int = x * 10^6 + y * 10^3 + z sarebbe stato sufficiente e molto probabilmente lo sarà dato che non ho mai visto un software con un valore maggiore / minore / patch di tre cifre, tuttavia in teoria è possibile che un tale algoritmo fallisca .

Supponiamo di avere versioni 2.0.0 e 1.1000.0 , in questo caso gli interi sarebbero

int(2.0.0)    = 2 * 10^6 + 0 * 10^3 + 0    = 2000000
int(1.1000.0) = 1 * 10^6 + 1000 * 10^3 + 0 = 2000000

Chiaramente l'algoritmo è difettoso, voglio chiedere se esiste un algoritmo noto che potrei usare.

Anche in questo caso probabilmente dovrei eseguire il calcolo in questo modo, ma sono interessato a scoprire se esiste un modo antiproiettile?

    
posta php_nub_qq 24.03.2016 - 18:43
fonte

4 risposte

7

No, non esiste un modo a prova di proiettile se non si conoscono i valori massimi in anticipo (il numero massimo di cifre per componente). Avrai anche bisogno di quelle informazioni per decodificare il numero.

Stai cercando di rappresentare qualcosa usando la notazione posizionale, quindi le posizioni nel tuo singolo intero hanno un significato intrinseco. Vi sono ulteriori informazioni all'interno della stringa di versione "x.y.z" (i punti che separano i componenti), che viene persa quando si esegue la conversione in un singolo intero.

    
risposta data 24.03.2016 - 18:57
fonte
4

Se l'unico requisito è che ogni stringa di versione abbia un identificativo intero univoco, puoi usare una funzione come:

int(x.y.z) = 2^x * 3^y * 5^z

Questo è facilmente reversibile trovando la fattorizzazione principale del numero intero, ma non ha lo stesso ordine delle stringhe di versione.

Modifica: se la dimensione del numero intero è un problema, trova la rappresentazione binaria per ogni elemento della tupla

x -> ...x3 x2 x1 x0
y -> ...y3 y2 y1 y0
z -> ...z3 z2 z1 z0

quindi interlaccia i bit

output = ... x3 y3 z3 x2 y2 z2 x1 y1 z1 z0 y0 z0

Questo dovrebbe essere più efficiente in termini di spazio rispetto all'archiviazione di una stringa di versione.

    
risposta data 24.03.2016 - 20:47
fonte
0

Oltre all'altra risposta, considera che scartare etichette come "alpha", ecc. non è una buona idea se devi confrontare le versioni. Invece di utilizzare le stringhe, prendi in considerazione l'analisi di una versione in un dato interno strutturato:

(major: 3, minor: 0, patch: 0, label: "alpha")

E definisci un ordinamento lessicografico personalizzato per confrontarli.

    
risposta data 24.03.2016 - 20:15
fonte
0

Non .

Non hai spiegato nella tua domanda perché vuoi farlo ma è probabilmente una cattiva idea. Penso che qualunque cosa tu stia pensando, è probabilmente meglio gestirlo in un modo diverso.

Se vuoi veramente mappare i numeri di versione ai numeri interi e averli unici, e per devi sapere quante cifre ogni parte della stringa di versione può avere. Quindi potresti fare qualcosa come hai menzionato nella tua domanda.

Inoltre, in termini di ordine, non sono veramente sicuro di cosa dovrebbe venire prima:

Version 1.0 - Released in Dec 2000
Version 1.1 - Released in Dec 2001
Version 2.0 - Released in Dec 2002
Version 1.2 - Released in Dec 2014

Vuoi ordinare per data di uscita o vuoi ordinare per versione principale, seguito da versione secondaria, seguito da ...?

    
risposta data 06.04.2016 - 00:13
fonte

Leggi altre domande sui tag