Генерировать одинаковый хэш из строк в непредсказуемом порядке C

#c #algorithm #hash

#c #алгоритм #хэш

Вопрос:

Я получаю на входе моей функции список строк. Но порядок этих строк может отличаться для каждого вызова функции. Я хочу сгенерировать хэш из этих строк, но он должен быть равен для двух строк, исключая порядок. Итак, хэш hello и world должен быть равен хэшу world и hello . Хэш должен быть безопасным и устойчивым к столкновениям. Как я могу это сделать?

PS: Я могу получить хэш из массива байтов, но не исключая порядок.

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

1. каковы ваши требования к этому хэшу? Должен ли он быть безопасным? Насколько вас беспокоят коллизии?

2. как насчет сортировки списка строк в алфавитном порядке перед генерацией хэша?

3. @AlanBirtles, да, хэш должен быть безопасным, меня беспокоят коллизии

4. вы должны отредактировать эти требования в своем вопросе, тем более что это делает недействительными 2 опубликованных в настоящее время ответа

5. Вопрос безопасности / коллизии на самом деле не актуален. Выберите любой хорошо известный криптографический хэш, который работает с одной строкой. Затем, чтобы использовать этот хэш в вашем списке строк: сначала отсортируйте строки (простой способ, вставьте каждый элемент в мультимножество). Затем определите внедрение из отсортированного списка строк (или мультимножества) в одну строку. Одна из таких инъекций: объединить отсортированный список с разделителем между каждым элементом, который не будет отображаться ни в одной строке (например, символ ` 0′, который по определению не отображается в строке).

Ответ №1:

Вам нужно использовать любой независимый от позиции хэш либо для байтов, либо использовать любой хэш для слов, а затем использовать независимый от позиции хэш для хэшей word.

Хэш, не зависящий от позиции, может быть любой функцией, которая имеет тот же результат при замене аргументов: , *, xor и т.д.

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

1. Безопасно ли это? А как насчет столкновений?

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

Ответ №2:

Вы можете использовать сумму каждого символа для хэша:

 'h'   'e'   'l'   'l'   'o'   'w'   'o'   'r'   'l'   'd' == 'w'   'o'   'r'   'l'   'd'   'h'   'e'   'l'   'l'   'o'