Как сократить 64-битное хеш-значение до 48-битного значения?

У меня уже есть 64-битная hash-функция в библиотеке (C-кодирование), но мне нужно всего лишь 48 бит. Мне нужно обрезать 64-битное хеш-значение до 48-битного значения, но оно должно быть безопасным образом, чтобы минимизировать столкновение.

Хеш-функция – очень хорошая 64-битная хеш-функция. Он был протестирован с SMHasher (тест хеширования «DieHarder») и оказался лучше, чем Murmur2. По словам моих коллег, алгоритм, реализованный в lib для 64-битного hashирования, – xxHash, протестирован с SMHasher и получил Q.Score из 10! Для тех, кто хочет это увидеть, исходный код для xxHash доступен на github.com: github.com/Cyan4973/xxHash/releases/latest .

Основная идея состоит в том, чтобы все биты в 64-битном хеш-значении (или их части) влияли на полученное 48-битное хеш-значение. Есть ли способ сделать это?

[Поздний EDIT]:
Поэтому я реализовал собственный 48-битный (квази) -UUID-генератор.
Пожалуйста, ознакомьтесь с полным рабочим решением (включая исходный код) здесь: https://stackoverflow.com/a/47895889/4731718 .

    Если 64-битный хеш хорош, выбор любых 48 бит также будет хорошим хешем. @Lee Даниэль . Конечно, информация теряется и не обратима.

     unsigned long long Mask48 = 0xFFFFFFFFFFFFu; unsigned long long hash48 = hash64 & Mask48; 

    Если 64-битная хеш-функция слабая, то mod по наибольшему простому просто под pow(2,48) . Некоторые ведра будут потеряны. Это не повредит хорошему хешу, но, безусловно, сделает слабые hash лучше.

     unsigned long long LargestPrime48 = 281474976710597u; // FFFFFFFFFFC5 unsigned long long hash48 = hash64 % LargestPrime48; 
     hash >>= 16; 

    Но если вы чувствуете себя лучше, произвольно сохраняя остальные 16 бит, просто используйте XOR.

     hash = (hash >> 16) ^ (hash & 0xFFFF); 

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

    И, конечно же, вы не можете сократить 64-битный хеш до 48 бит без потерь, и безопасное хеширование – это совершенно другая тема. Вы могли бы сделать что-то вроде обычной 32-битной хеш-функции, например CRC32, и просто иметь 16 пустых бит. Или даже комбинировать 32-битную и 16-битную, но это кажется действительно очень странным. С точки зрения безопасности на столкновение это даже не вещь, и я бы не хотел слышать ответ криптологически опытного человека на это.

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