2010-11-10 112 views
1

我在C++中有三個變量int32數據類型。我想爲C++中的三個int32數字的組合生成唯一編號。例如,我有int iVal1int iVal2int iVal3。有沒有任何算法來做到這一點?生成唯一編號

爲了避免混淆,我將重新解釋這個問題。基本上我想用三個整數生成一個唯一的數字,因爲我想把這個數字存儲爲映射中的一個鍵來檢索數據。

有什麼建議嗎?謝謝。

+3

完全不清楚。它應該如何「獨特」?這些數字應該如何混合到結果中?結果應該重現嗎? – sharptooth 2010-11-10 10:36:12

+1

您需要從三個整數生成一個隨機數,如問題標題所示?或者您是否需要一種方法來以更安全或更不安全的方式計算三個數字中的單個數字?數學意義上它應該是獨一無二的嗎?而且它應該是一個int嗎?如果最後兩個條件成立,那麼這是不可能的。 – gregor 2010-11-10 10:36:26

+1

隨機數字和唯一數字是不同的東西。你沒有真正解釋你需要什麼。 – 2010-11-10 10:36:55

回答

0

對於計算方法,你可以看看這裏:Linear congruential generator

,用於從其他三個數一數unqiue另一種方法是增加(工作至少一次)。

int n = x1 + x2 + x3 

現在n是一個新的唯一編號。

+1

爲什麼這是低調?這個問題可以解釋,以便這個答案是正確的。 @Downvoter:請解釋.. – Default 2010-11-10 10:47:04

+0

'n'既不是唯一也不是隨機的。 x1 = x2 = 0並且x3 = 3並且x1 = x2 = x3 = 1產生相同的結果。 – gregor 2010-11-10 11:08:58

+0

@gregor:如果你將3個整數映射成一個整數,那麼你對這3個整數做了什麼,n將既不唯一也不隨機。 – 2010-11-10 11:36:58

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

格雷戈爾是正確的,你不會從三個(或甚至兩個)整數的代數組合獲得一個獨特的價值。但是很難從你的問題的措辭中知道你真正的想法。如果您確實需要一個唯一的號碼,請查看UUID

+0

爲什麼這是低調的?標題的問題可以解釋,以便這個答案是正確的。 @Downvoter:請解釋.. – Default 2010-11-10 10:46:24

1

串聯數一起用於許多具有3倍一樣多的位作爲INT具有(96個比特)

號1:0xDEADFACE;編號2:0xF00BA4; 3號:42

結果:0xDEADFACE00F00BA40000002A


編輯:返回例如使用組成新號碼爲字符串

#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 2010-11-10 11:49:25

+0

C不直接處理96位值,但您可以創建字符串。看看我的編輯 – pmg 2010-11-10 12:04:56

+0

你需要一個'char [12]'(或者更一般地說,一個'char [3 * sizeof(int)]',你只需要'memcpy'三個int就可以'char [0]', 'char [4]'和'char [8]'。 – MSalters 2010-11-10 12:26:46

1

您可以使用一個很好的散列函數。

+0

或散列兩次(NULL) – user503194 2010-11-10 12:46:34

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),因此沒有隨機生成器。