2016-10-04 3 views
0

мне нужна простой хэш-функция, которая принимает два параметра, со следующими параметрами:Хэша функция F (а, б) = F (Ь, а)

  • а, б, в, г являются разными строками (приблизительно 30 символов)
  • F (а, б) = F (Ь, а)
  • е (а, с) ≠ f (a, d)
  • F (C, б) ≠ F (д, b)
+3

Можете ли вы сделать домашнее задание дома, отдельно, самостоятельно? – Raptor

+1

И вы пробовали ... – Abhineet

+0

'f (x, y) = md5 (x^y)', например –

ответ

2

Сортировка и объединение двух параметров (для обеспечения того, чтобы f(a,b) равно f(b,a). Поскольку для сортировки есть только два элемента, будет либо ab, либо ba.

Если строки имеют свойство, ab может равняться cd (например strong + hearted и strongheart + ed) вы можете в «соль» строку, предваряя его длине первой строки, закодированной в виде фиксированного числа байтов.

Затем примените строковый хэш на результат. There are numerous examples online.

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

+1

Почему это было ниспровергнуто? Этот ответ неверен? Это выглядит правильно для меня (моя первая мысль заключалась в том, чтобы сделать это точно). – Dogbert

+1

В дополнение к сортировке, это хорошая предосторожность для добавления строк до конкатенации с длиной строк. Это предотвращает поиск тривиальных столкновений типа 'f (" abc "," def ") = f (" ab "," cdef ")'. Я бы предложил добавить 4-байтовый int (вместо длины в строке ascii). Так, например: 'f (a, b) = h (len (a) .to_bytes (4) + a + len (b) .to_bytes (4) + b)' где a

+1

@LieRyan Спасибо! Я улучшил свой ответ. (на самом деле достаточно указать длину первой строки). –

Смежные вопросы