2010-11-10 3 views
1

У меня есть три переменные типа данных int32 в C++. Я хочу создать уникальный номер для комбинации из трех номеров int32 в C++. Например, у меня есть int iVal1, int iVal2 и int iVal3. Есть ли какой-нибудь алгоритм для этого?Создание уникального номера

Во избежание путаницы в вопросе я буду перефразировать вопрос. В основном я хочу сгенерировать уникальный номер с тремя целыми числами, потому что я хочу сохранить этот номер в качестве ключа на карте для извлечения данных.

Любые предложения? Благодарю.

+3

Совершенно неясно. Как это «уникально»? Как эти цифры смешиваются с результатом? Должен ли результат быть воспроизводимым? – sharptooth

+1

Вам нужно случайное число, сгенерированное из трех целых чисел, как это указано в названии вашего вопроса? Или вам нужен способ вычислить один номер из трех более или менее безопасным способом? Должна ли она быть уникальной в математическом смысле? И должен ли он снова быть int? Если выполняются последние два условия, это невозможно. – gregor

+1

Случайные числа и уникальные номера - это разные вещи. Вы действительно не объясняете, что вам нужно. –

ответ

0

Для вычислительного метода можно посмотреть здесь: Linear congruential generator

Другой метод для создания уникального мировоззрения номер из трех других чисел сложение (работает по крайней мере один раз).

int n = x1 + x2 + x3 

n - новый уникальный номер.

+1

Почему это было приостановлено? Вопрос может быть истолкован таким образом, чтобы этот ответ был правильным. @Downvoter: пожалуйста, объясните .. – Default

+0

'n' не является ни уникальным, ни случайным. x1 = x2 = 0 и x3 = 3 и x1 = x2 = x3 = 1 дают тот же результат. – gregor

+0

@gregor: если вы наберете 3 целых числа в один, что бы вы ни делали с этими целыми числами, n не будет ни уникальным, ни случайным. –

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 правильно, что вы не получите уникальное значение из алгебраической комбинации из трех (или даже двух) целых чисел. Но трудно понять, что вы на самом деле после формулировки своего вопроса. Если вы действительно хотите уникальный номер, посмотрите на UUID.

+0

Почему это было приостановлено? Вопрос с заголовком можно интерпретировать так, чтобы этот ответ был правильным. @Downvoter: пожалуйста, объясните .. – Default

1

конкатенация числа вместе в течение ряда с 3 раза больше бит, как INT имеет (96 бит)

номер 1: 0xDEADFACE; номер 2: 0xF00BA4; номер 3: 42

результат: 0xDEADFACE00F00BA40000002A


Edit: пример использования, который возвращает сочиняет новый номер строки

#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; 
} 

Пример запуска

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

как это сделать в C – Venkata

+0

C не имеет прямого отношения к значениям 96 бит, но вместо них вы можете создавать строки. См. Мое редактирование. – pmg

+0

. Вам понадобится 'char [12]' (или, более общо, 'char [3 * sizeof (int)]'. Вы можете просто «memcpy» три ints «char [0]», 'char [4]' и 'char [8]'. – MSalters

1

Вы можете использовать хорошая хеш-функция.

+0

или хэш два раза со временем (NULL) – user503194

0

Я думаю, что я понимаю. Venkata имеет коллекцию из трех чисел. Пример: 42, 35, 127. Для каждой комбинации из них ему нужен уникальный номер. Пример:

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

и GetNumber (a) всегда будет == GetNumber (a), поэтому никаких случайных генераторов нет.

Смежные вопросы