Avatar billede spif Nybegynder
24. maj 2006 - 21:34 Der er 6 kommentarer og
1 løsning

Genereing af unikke billetter

Hej eksperter

Jeg har brug for lidt hjælp til at generere rigtig mange billetter (nok et par millioner med tiden) som skal opfylde følgende krav:

1. En billet skal altid være unik.
2. Når man har en billet, må det ikke være "muligt" at gætte sig til en anden billet.
3. Må ikke være for lang (~12 tegn)
4. Det ville være godt hvis man kan dele billetten op i 3 dele [tal][bogstaver][tal]

Jeg har et unikt løbenummer at starte med.

Har I nogen ideer? Alle kravene behøver ikke være opfyldt før jeg giver point, men jeg har brug for hjælp for at komme på rette vej.
Pseudo kode er også velkommen, men vil foretrække et kode eksempel.

spif
Avatar billede nico26 Nybegynder
24. maj 2006 - 21:53 #1
Du kan jo reservere de første otte tegn til et løbenummer - så er du sikker på at hver billet er unik. Hvis du så laver sætter fire tilfældige bogstaver til sidst er der 1,6 * 10^-4 % chance for at gætte det næste nummer...
Avatar billede spif Nybegynder
24. maj 2006 - 23:13 #2
Løbenummeret må ikke være med i selve billetten. Det jeg havde tænkt mig var at et løbenummer skal transformeres til selve billetten.

eksempel:
løbenummer: 12749 bliver fx. til billet: [2458][AZGH][4562]
og billeten til løbernummer 12750 bliver noget helt andet..
Avatar billede arne_v Ekspert
25. maj 2006 - 04:14 #3
en god løsning ville være hvis du kunne tillade dig at bruge 32 tegn, fordi
så kunne du bruge MD5 af løbenummer CONCAT hemmeligt password

skal du have en høker løsning så er her et forslag:

package may;

public class UniqueTickets {
    private final static int[] w = { 29, 23, 19, 17, 13, 11, 7, 5, 3, 2 };
    private static int chksum(int v) {
        int res = 0;
        int tmp = v;
        for(int i = 0; i < 10; i++) {
            res += w[i]*(tmp % 10);
            tmp /= 10;
        }
        return 99 - res % 100;
    }
    private static String toFixString(int v, int w) {
        String tmp = Integer.toString(v);
        return "0000000000".substring(0, w - tmp.length()) + tmp;
    }
    public static String seqToUid(int seq) {
        String res = "";
        res += ((3 * seq + 1) % 7);
        res += toFixString((1234 + seq % 10000) % 10000, 4);
        res += toFixString(chksum(seq), 2);
        res += toFixString((1234 + seq / 10000) % 10000, 4);
        res += (seq % 7);
        return res;
    }
    public static int uidToSeq(String uid) {
        int part1 = Integer.parseInt(uid.substring(0, 1));
        int part2 = Integer.parseInt(uid.substring(1, 5));
        int part3 = Integer.parseInt(uid.substring(5, 7));
        int part4 = Integer.parseInt(uid.substring(7, 11));
        int part5 = Integer.parseInt(uid.substring(11, 12));
        int res = ((8766 + part4) % 10000) * 10000 + ((8766 + part2) % 10000);
        if(part1 != (3 * res + 1) % 7) throw new IllegalArgumentException("Invalid ticket");
        if(part3 != chksum(res)) throw new IllegalArgumentException("Invalid ticket");
        if(part5 != res % 7) throw new IllegalArgumentException("Invalid ticket");
        return res;
    }
    public static void main(String[] args) {
        for(int i = 0; i < 100; i++) {
            System.out.println(uidToSeq(seqToUid(i)) + " " + seqToUid(i));
        }
    }
}
Avatar billede spif Nybegynder
25. maj 2006 - 21:33 #4
Rigtig godt eksempel Arne, det har helt sikkert givet mig nogle ideer jeg kan arbejde videre med. Hvor mange unikke tickets kan man så lave med dit eksempel?
Kan du ikke lige smide et svar, så du kan få dine velfortjente point.
Avatar billede arne_v Ekspert
25. maj 2006 - 22:03 #5
Mit eksempel understoetter op til 100 millioner tickets.

Styrken ved det er at der kan laves en validering uden at kende det sekventielle
nummer og uden at have en database med alle valide.

Men det er ikke kryptografisk staerkt.
Avatar billede arne_v Ekspert
25. maj 2006 - 22:03 #6
svar
Avatar billede spif Nybegynder
25. maj 2006 - 22:29 #7
tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester