Objective c 从各种其他数字类型计算一个唯一的id,该id是无符号整数

Objective c 从各种其他数字类型计算一个唯一的id,该id是无符号整数,objective-c,Objective C,我想从3个输入号码创建一个唯一的id。我不在乎输出是什么,只要它是唯一的。输入数字为: NSNumber num NSUInteger hash int i 输出应为: unsigned int id 我不关心任何输入数字的精度损失,因此我考虑将id计算为: id=(无符号整数)num+(无符号整数)hash+(无符号整数)i 但我发现有两个问题: 整数溢出时会发生什么情况 我在查找有关Objective-C中整数溢出发生的情况的文档时遇到问题 我找到的最好的来源是这篇文章,它说结果是未定义

我想从3个输入号码创建一个唯一的id。我不在乎输出是什么,只要它是唯一的。输入数字为:

NSNumber num
NSUInteger hash
int i
输出应为:

unsigned int id
我不关心任何输入数字的精度损失,因此我考虑将id计算为:

id=(无符号整数)num+(无符号整数)hash+(无符号整数)i

但我发现有两个问题:

整数溢出时会发生什么情况

我在查找有关Objective-C中整数溢出发生的情况的文档时遇到问题

我找到的最好的来源是这篇文章,它说结果是未定义的:

那不好。我不介意再次从0开始,但undefined不是唯一的id

如何实现对无符号整数的强制转换

我还没有找到任何关于如何实现转换为unsigned int的信息。只要将现有的位解释为无符号int就行了。但是如果结果是不确定的或者类似的话,我就不会按我的意愿去做

我不知道前进的最佳途径是什么


我应该如何计算一个唯一的id,该id是来自各种其他数字类型的无符号整数?

考虑对这些值的字符串表示形式进行散列:

NSNumber *num;
NSUInteger hash;
int i;

NSString *string = [NSString stringWithFormat:@"%@%lu%d", num, (unsigned long)hash, i];
NSUInteger myId = [string hash];

这个唯一的ID将用于什么?例如,如果是基于基类哈希的子类哈希,您可以在此处引用:。一些答案和注释专门针对签名溢出,以及为什么在计算哈希值时它无关紧要(即,仅b/c未定义并不意味着它没有用处)。此外,您的计算不能保证唯一性:对于相同的哈希值,如果在一种情况下num=2和i=1,但在另一种情况下num=1和i=2会怎么样?看同样的参考文献。你想要的是不可能的。您可以计算散列,但设计上,散列从来都不是唯一的。如果您有3个数字,并且您想要一个唯一的标识符,那么您需要您的标识符来包含所有3个数字,因此标识符的长度将是各个数字长度的总和
NSNumber
保存一个双精度整数,因此两个整数的64位+至少32位。您需要一个能够容纳128位数字的类型。哈希将不是唯一标识符。还有,你为什么要在图片中加入字符串?您可以直接从数值计算散列。