2010-12-12 45 views
4

J'ai des nombres dans la plage 1-62 Je veux être en mesure de les "crypter", de sorte qu'il est difficile de deviner qu'ils sont générés dans un certain ordre.Numéros de réorganisation

Ainsi, il devrait y avoir une cartographie, par exemple

1-> 35 2-> 3- 19 > 61 ...

de sorte que j'ai 1 à 1 mapping, 100 % réversible.


je peux hardcode la cartographie, mais je préférerais une solution de mathématiques à cela, une sorte de formule qui prend comme argument numéro, et produit nombre dans la gamme 1-62, et ne génère pas de doublons. Y a-t-il une chance que cette formule existe?


Juste pour l'histoire, le script de validation:

<? 
    $test = array(); 

    $val = 37; 
    for($i=0;$i<62;$i++) 
    { 
    if($test[($i*$val)%62]) 
    { 
     print("Collision: $i ".$test[($i*$val)%62]."<br/>"); 
    } 
    $test[($i*$val)%62] = $i; 
    print("$i => ".(($i*$val)%62)."<br/>"); 
    } 

?> 

Mise à jour:

Voici les identifiants générés grâce à ces réponses:

qpOLHk 
NMb84H 
aI740D 
x5urn0 
UsROKn 
hPeb7K 
EcByu7 
1zYVRu 
oWlieR 
LjIFBe 
8G52YB 
v3splY 
SqPMIl 
fNc95I 
Cazws5 
ZxWTPs 
mUjgcP 
JhGDzc 
6E30Wz 

:-) Sweeeeeet

Répondre

3

Vous pouvez placer les numéros 1 à 62 dans un tableau et mélanger le tableau (par exemple en utilisant le Fisher-Yates shuffle). L'index du tableau est ensuite mappé au contenu de cette cellule (mais attention à l'erreur "off-by-one" si vous utilisez des tableaux indexés 0).

Pour le rendre déterministe, utilisez une graine particulière pour le générateur de nombres aléatoires.

Edit: A moins coûteux en calcul (et aussi plus facile à deviner) la cartographie est de multiplier par une constante et ensuite calculer le résultat modulo 62:

result = (input * 37) % 62 

Le nombre 37 est juste un exemple. Vous pouvez utiliser n'importe quel nombre qui est coprime à 62 - c'est n'importe quel nombre impair, sauf 31. 31.

+0

Cela vaut pour le codage en dur que je considérais.la graine statique ferait, mais j'ai peur que ce soit trop de traitement, j'ai besoin de quelque chose de simple ... – BarsMonster

+0

@BarsMonster: Combien de traitement est autorisé? Et quelle partie de cet algorithme considérez-vous comme trop chère? –

+0

Ceci serait effectué 10'000 fois par seconde en langage interprété. Alors que je vois que votre solution correspond probablement en termes de performance, j'aime vraiment avoir quelque chose comme output = (input + 35)% 62, mais un peu plus aléatoire. – BarsMonster

0

Utilisez RSA. C'est assez facile à implémenter (enfin, ça dépend de la langue) et voici un worked example.

+1

Malheureusement, sa sortie est des nombres modulo un grand nombre => Je ne vois pas comment il mappe chaque valeur à une autre valeur sans doublons dans la plage spécifiée. – BarsMonster

+0

@BarsMonster: Vous avez raison. Je n'ai pas vu que vous aviez besoin de sorties de 1-62 aussi. – Jacob

1

Dans le même ordre d'idées que Mark Byers. Trouvez l'inverse de x mod n (par exemple, n = 62).

Soit x être votre nombre entier d'entrée dans l'intervalle [1, n]. Utilisez le extended Euclidean algorithm pour trouver y et t tel que xy + nt = 1 mod n. Puis y = x^{-1} mod n.