Хэш для неупорядоченного набора?

#algorithm #hash #html-lists

#алгоритм #хэш #html-списки

Вопрос:

Я пытаюсь решить проблему одностороннего отступа, группа авторов хочет опубликовать что-то, не раскрывая свои собственные данные username , так есть ли алгоритм / библиотека для хеширования неупорядоченного набора username s?

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

Дополнительные вопросы (не обязательные для основного вопроса):

  1. Если такой алгоритм существует, можем ли мы проверить, является ли a username одним из авторов по хэшу?
  2. Если мы уже знаем хэш группы username ов, то добавлен новый автор, можем ли мы получить новый хэш, не зная предыдущих авторов username ?

Комментарии:

1. Можете ли вы пояснить, чего вы на самом деле пытаетесь достичь? Если вы хотите опубликовать что-то, не раскрывая своего имени пользователя, почему бы просто не оставить это без подписи? Что вы хотите, чтобы эта структура данных включала?

Ответ №1:

Готовы ли вы принять небольшую вероятность ложных срабатываний, то есть имен, которые не являются авторами, которые будут неправильно идентифицированы как авторы, если кто-нибудь проверит? (Вероятность может быть сколь угодно малой.)

Если это так, то фильтр Блума идеально подойдет.

Комментарии:

1. Вау, это круто. Я рассмотрю это 🙂 Кстати, фильтры Блума переваривают фиксированную длину? Я действительно хочу сохранить количество авторов в секрете.

2. Проблема с фильтром Блума заключается в том, что количество элементов в именах пользователей значительно. Классический фильтр Блума работает только для ожидаемой мощности (с допустимой частотой ложноположительных результатов).

3. @est: Фильтр Блума имеет фиксированную длину. Частота ложноположительных результатов зависит от количества авторов и этой длины. @thomas-jung: Полезно знать о режиме сбоя, но я думаю, что в данном случае это, скорее всего, будет нормально.

4. Фильтр Блума здесь идеален. Если бы вы только что опубликовали список хэшей, все не только знали бы точное количество авторов, если бы они нашли совпадение, они могли бы быть достаточно уверены, что все сделали правильно, из-за устойчивости хэшей к коллизиям, таких как SHA1.

Ответ №2:

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

Если вы заранее знаете все имена пользователей, вы можете сгенерировать минимальный идеальный хэш, но каждый раз, когда вы добавляете имя пользователя, вам придется генерировать совершенно новую хэш-таблицу — с другими хэшами. Это, очевидно, не очень хорошее решение.

Это зависит от того, как вы хотите, чтобы выглядели ваши окончательные ключи.

Одна из возможностей — присвоить уникальные последовательные идентификаторы именам пользователей, а затем запутать эти идентификаторы, чтобы они не выглядели как последовательные идентификаторы. Это похоже на то, что YouTube делает со своими идентификаторами — они превращают 64-битное число в 11-символьную строку base64. Я написал небольшую статью об этом с кодом на C #. Проверьте http://www.informit.com/guides/content.aspx?g=dotnetamp;seqNum=839.

И, да, процесс обратим.

Ответ №3:

Похоже, что один хэш не принесет вам никакой пользы. 1. Вы не можете проверить, что в хэше присутствует одно имя пользователя; вам нужно знать все имена пользователей. 2. Вы не можете добавить нового пользователя в хэш, не зная ничего о неэшированных именах пользователей (порядок, в котором вы добавляете пользователей в хэш, будет иметь значение для всех хороших алгоритмов хэширования).

Для # 2 частичным решением является то, что вы не будете сохранять все имена пользователей, просто сохраните что-то вроде XOR всех существующих пользователей. Когда вы хотите добавить нового пользователя, замените его на существующего и повторно хэшируйте результат. Тогда не будет иметь значения, в каком порядке вы добавили пользователей.

Но реальное решение, я думаю, это просто иметь набор хэшей, а не хэш набора. Есть причина, по которой вы не можете этого сделать? Тогда вы можете легко сохранить набор упорядоченным или неупорядоченным по своему усмотрению, вы можете легко добавлять пользователей в набор и легко проверять, есть ли данный автор уже в наборе.

Комментарии:

1. Спасибо за идеи, причина, по которой я не хочу «набор хэшей», заключается в том, чтобы сохранить количество авторов в секрете.