2010-11-10 4 views
1

J'ai trois variables de type int32 en C++. Je veux générer un nombre unique pour la combinaison de trois numéros int32 dans C++. Par exemple j'ai int iVal1, int iVal2, et int iVal3. Y a-t-il un algorithme pour le faire? Afin d'éviter toute confusion en question, je vais reformuler la question. Fondamentalement, je veux générer un nombre unique avec trois entiers parce que je veux stocker ce nombre comme une clé dans la carte pour récupérer les données.Génération d'un nombre unique

Des suggestions? Merci.

+3

Complètement imprécis. Comment "unique" devrait-il être? Comment ces chiffres devraient-ils se mélanger dans le résultat? Le résultat devrait-il être reproductible? – sharptooth

+1

Avez-vous besoin d'un nombre aléatoire généré à partir des trois ints, comme suggéré par le titre de votre question? Ou avez-vous besoin d'un moyen de calculer un numéro unique parmi les trois d'une manière plus ou moins sécurisée? Devrait-il être unique au sens mathématique? Et devrait-il être un int encore? Si les deux dernières conditions sont réunies, cela n'est pas possible. – gregor

+1

Les nombres aléatoires et les nombres uniques sont des choses différentes. Vous n'expliquez pas vraiment ce dont vous avez besoin. –

Répondre

0

Pour une méthode de calcul, vous pouvez regarder ici: Linear congruential generator

Une autre méthode pour générer un nombre unqiue de trois autres numéros est plus (fonctionne au moins une fois).

int n = x1 + x2 + x3 

maintenant n est un nouveau numéro unique.

+1

Pourquoi cela a-t-il été réduit? La question pourrait être interprétée pour que cette réponse soit correcte. @Downvoter: veuillez expliquer. – Default

+0

'n' n'est ni unique ni aléatoire. x1 = x2 = 0 et x3 = 3 et x1 = x2 = x3 = 1 produisent le même résultat. – gregor

+0

@gregor: si vous mappez 3 entiers en un, quoi que vous fassiez avec ces 3 entiers, n ne sera ni unique ni aléatoire. –

0
#include <stdint.h> 
#include <time.h> 
#include <limits.h> 

int main (int argc, char **argv) { 
    uint32_t firstInt, secondInt, thirdInt; 

    srandom(time(NULL)); /* seed RNG */ 

    firstInt = random(UINT32_MAX); 
    secondInt = random(UINT32_MAX); 
    thirdInt = random(UINT32_MAX); 

    /* do something with unsigned ints */ 

    return 0; 
} 

gregor est exact que vous n'obtiendrez une valeur unique à partir d'une combinaison algébrique de trois (ou même deux) entiers. Mais il est difficile de savoir ce que vous voulez vraiment du libellé de votre question. Si vous voulez vraiment un numéro unique, regardez dans un UUID.

+0

Pourquoi était-ce downvoted? La question avec le titre pourrait être interprétée pour que cette réponse soit correcte. @Downvoter: expliquez svp .. – Default

1

concaténer les nombres ensemble pour un nombre de 3 fois autant de bits comme un int a (96 bits)

numéro 1: 0xDEADFACE; numéro 2: 0xF00BA4; Numéro 3: 42

Résultat: 0xDEADFACE00F00BA40000002A


Edit: par exemple l'utilisation qui retourne compose le nouveau numéro d'une chaîne

#include <stdio.h> 

/* writes a, b, c into dst 
** dst must have enough space for the result */ 
char *concat3(char *dst, unsigned a, unsigned b, unsigned c) { 
    sprintf(dst, "%08x%08x%08x", a, b, c); 
    return dst; 
} 

/* usage */ 
int main(void) { 
    char n3[25]; /* 25 = 3*8 for each integer + 1 for terminating null */ 
    concat3(n3, 0xDEADFACE, 0xF00BA4, 42); 
    printf("result is 0x%s\n", n3); 
    return 0; 
} 

run échantillon

$ ./a.out 
result is 0xdeadface00f00ba40000002a 
+0

comment faisons-nous cela dans C – Venkata

+0

C ne traite pas directement les valeurs de 96 bits, mais vous pouvez faire des chaînes à la place. Voir mon édition – pmg

+0

Vous auriez besoin d'un 'char [12]' (ou plus généralement, un 'char [3 * sizeof (int)]'. Vous pouvez simplement 'memcpy' les trois entrées de' char [0] ', 'char [4]' et 'char [8]'. – MSalters

1

Vous pouvez utiliser une bonne fonction de hachage.

+0

ou hacher deux fois avec le temps (NULL) – user503194

0

Je pense que je comprends. Venkata a une collection de trois nombres. Ex: 42, 35, 127. Pour chaque combinaison de ceux-ci, il a besoin d'un nombre unique. Ex:

int a[2] = {25, 63, 12}; 
int b[2] = {149, 28, 56}; 
GetNumber(a) != GetNumber(b) 

et GetNumber (a) sera toujours == GetNumber (a), donc pas de générateurs aléatoires.

Questions connexes