这个哈希保证是唯一的吗?

时间:2014-02-08 10:00:37

标签: ios objective-c cocoa unique

我需要唯一标识一对Facebook用户ID。这就是我这样做的方式:

NSString *firstId  = @"123456789";
NSString *secondId = @"987654321";

NSUInteger first_hash = [firstId hash];
NSUInteger second_hash = [secondId hash];

NSUInteger combinedHash = first_hash ^ second_hash;
NSUInteger reverseHash  = second_hash ^ first_hash;

NSLog(@"Combined hash %d\nReverse hash %d", combinedHash, reverseHash); // both are equal

好的,现在我知道无论哈希组合的顺序如何,我都得到相同的值。非常好。但这个价值是否保证是唯一的?或者,322233322233322233的ID组合可能会产生与combinedHash相同的值?如果是,那么如何为一对ID创建唯一标识符?

2 个答案:

答案 0 :(得分:5)

如果不了解ObjectiveC,看起来你只是对这些价值进行异或 当然,这不是唯一的 101 ^ 100 = 001
001 ^ 000 = 001
这很容易。

它必须是不可逆转的哈希还是只需要一个唯一的ID? 后者:只需连接,两者之间有唯一的分隔符 否则,根据最大可能的输入长度,可能无法使用唯一的哈希值 (没有发明一种全新的算法,这可能需要时间:))

编辑,关于两种可能的连接顺序:
只需比较连接前的两个数字,然后将较小的数字放在第一位 这样,按ID进行的任何搜索都不能进行两次。

答案 1 :(得分:3)

你的第一个问题的答案是否定的,因为1 ^ 1 == 0 ^ 0和1 ^ 0 = 0 ^ 1.所以如果你在你的第一个哈希中翻转一下,并且你的第二个哈希中的相同比特那么你的第一个和第二个哈希值会有所不同,但组合哈希值将保持不变。

散列的要点是识别信息少于原始对象的信息。当您压缩信息以更快地进行比较时,可以保证散列不会是唯一的。

将1个ID添加到另一个ID的末尾。