Итак, вы ищете что-то, обеспечивающее эти свойства,
1. If h(x1) == y1, then there is an inverse function h_inverse(y1) == x1
2. Because the inverse function exists, there cannot be a value x2 such that x1 != x2, and h(x2) == y1.
Мультипликативный метод Кнута
В книге Кнута «Искусство компьютерного программирования», раздел 6.4, aмультипликативная схема хеширования представлена как способ написания хеш-функции.Ключ умножается на золотое отношение 2 ^ 32 (2654435761) для получения результата хеширования.
hash(i)=i*2654435761 mod 2^32
Так как 2654435761 и 2 ^ 32 не имеют общих общих факторов, умножение производит полное отображениеключ к хеш-результату без наложения.Этот метод работает очень хорошо, если ключи имеют небольшие значения.Плохие результаты хеширования получаются, если ключи меняются в старших битах.Как и во всех умножениях, вариации старших цифр не влияют на нижние цифры результата умножения.
96-битная функция микширования Роберта Дженкинса
разработал хеш-функцию, основанную на последовательности вычитания, исключающего или и битового смещения.
Все источники в этой статье написаны как методы Java, где оператор «>>>» представляет концепцию без знакасдвиг вправо.Если источник должен быть переведен в C, то тип данных Java 'int' должен быть заменен типом данных C 'uint32_t', а тип данных Java 'long' должен быть заменен типом данных C 'uint64_t'.
Следующий источник - это часть микширования хеш-функции.
int mix(int a, int b, int c)
{
a=a-b; a=a-c; a=a^(c >>> 13);
b=b-c; b=b-a; b=b^(a << 8);
c=c-a; c=c-b; c=c^(b >>> 13);
a=a-b; a=a-c; a=a^(c >>> 12);
b=b-c; b=b-a; b=b^(a << 16);
c=c-a; c=c-b; c=c^(b >>> 5);
a=a-b; a=a-c; a=a^(c >>> 3);
b=b-c; b=b-a; b=b^(a << 10);
c=c-a; c=c-b; c=c^(b >>> 15);
return c;
}
Подробности можно прочитать по здесь