2010-11-10 116 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),因此没有随机生成器。