Является ли этот хэш уникальным?

97
10

Мне нужно однозначно идентифицировать пару идентификаторов пользователей Facebook. Вот как я это делаю:


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


Хорошо, теперь я знаю, что независимо от порядка, в котором объединены хеши, я получаю одинаковое значение. Это хорошо. Но является ли эта ценность уникальной? Или возможно, что комбинация идентификаторов 322233322 и 233322233 будет давать то же значение, что и для combinedHash? Если да, то как сделать уникальный идентификатор для пары идентификаторов?

спросил(а) 2021-01-19T18:15:03+03:00 2 месяца, 3 недели назад
1
Решение
107

Не понимая большую часть ObjectiveC, похоже, что вы просто XOR-ing значения.

Это, конечно, НЕ уникально.
101 ^ 100 = 001

001 ^ 000 = 001

Это так просто.


Должен ли он быть необратимым хешем или вам нужен только уникальный идентификатор?

Последнее: просто объедините, с уникальным разделителем между ними.

Иначе, в зависимости от максимально возможной длины ввода, уникальный хэш, вероятно, невозможно.

(не изобретая совершенно новый алгоритм, который может занять время:))

edit, о двух возможных порядках конкатенации:

Просто сравните два числа перед конкатенацией и сначала поставьте меньше.

Таким образом, любой поиск по ID не должен выполняться дважды.

ответил(а) 2021-01-19T18:15:03+03:00 2 месяца, 3 недели назад
87

Ответ на ваш первый вопрос - нет, потому что 1 ^ 1 == 0 ^ 0 и 1 ^ 0 = 0 ^ 1. Итак, если вы переверните бит в своем первом хэше и тот же бит во втором хеше, первый и второй хэш будут разными, но комбинированный хеш останется прежним.


Точка хэша должна идентифицировать что-то с меньшей информацией, чем в исходном объекте. Когда вы уплотняете информацию для ускорения сравнений, гарантируется, что хэш не будет уникальным.

Прибытие 1 идентификатора в конец другого.

ответил(а) 2021-01-19T18:15:03+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема