代码之家  ›  专栏  ›  技术社区  ›  Andrey Chernukha

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

  •  4
  • Andrey Chernukha  · 技术社区  · 12 年前

    我需要唯一地识别一对 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
    

    好的,现在我知道了,不管哈希的组合顺序如何,我得到的值都是相同的。这很好。但这个值是否保证是唯一的?或者有可能是id的组合 322233322 233322233 将产生与 combinedHash ? 如果是,那么我如何为一对id创建唯一标识符?

    2 回复  |  直到 12 年前
        1
  •  5
  •   deviantfan    12 年前

    在不太了解ObjectiveC的情况下,看起来您只是对值进行异或运算。
    当然,这不是唯一的。
    101^100 = 001
    001^000 = 001
    这很容易。

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

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

        2
  •  3
  •   James Snook    12 年前

    第一个问题的答案是否定的,因为1^1==0^0和1^0=0^1。因此,如果你在第一个哈希中翻转一位,而在第二个哈希中则翻转相同的位,那么你的第一个哈希和第二个散列将不同,但组合的哈希将保持不变。

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

    将一个ID追加到另一个ID的末尾。