int (11) для фиксированного числа (8 символов) уникального хэша - PullRequest
0 голосов
/ 27 апреля 2011

У меня проблема следующая:

  1. user_id (int (10))
  2. oerder_type (tinyint (1))

    преобразовать из1) +2) = int (11) к хешу

    [0-9a-z] {8}

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Если вам просто нужна хеш-функция для поиска в хеш-таблице, я рекомендую использовать Murmurhash .10 ^ 11 находится между 2 ^ 36 и 2 ^ 37.Поэтому, вызовите хеш, который генерирует 64-битный (Murmurhash2) или 128-битный (Murmurhash3) хеш, и мод 10 ^ 11.В отличие от простого преобразования базисов, использование хеш-функции может привести к конфликтам, даже если она сильно (если не идеально) распределена равномерно.Тем не менее, вы получите гораздо лучший эффект лавины. Здесь - результат теста на лавину.

Если Murmurhash невозможен, функции Jenkins lookup также хороши. Здесь - это результат лавинообразного теста.

Если производительность не является проблемой или требуется криптографическая защита, SHA-1 может быть лучшим выбором, который имеет гораздо больше оболочек на разных языках.,Не используйте CRC32 (плохая лавина).

РЕДАКТИРОВАТЬ : если вам нужна хэш-функция PHP, вот пример кода

function my_hash($user_id, $order_type)
{
    // construct integer (10^11)
    $data = $user_id * 10 + $order_type;
    // convert decimal to raw binary string (at most 5 bytes)
    $hex = dechex($data);
    $binary = pack('H*', $hex);
    // hash binary string. Substitute 'sha1' with other algorithms listed in http://www.php.net/manual/en/function.hash-algos.php if needed
    $hash = hash('sha1', $binary);
    // output first 8 bytes
    return substr($hash, 0, 8);
}

echo my_hash(1234567890, 0);  // 199f4bc7
echo my_hash(1234567890, 1);  // f3706f03

Также есть Расширение PHP для Murmurhash2 .Вы можете скомпилировать и установить, если вы запускаете PHP на Linux.Замените эти файлы Murmurhash2 на Murmurhash3, может быть, даже лучше.

0 голосов
/ 27 апреля 2011

Вы можете использовать тривиальную хеш-функцию, потому что:

36^8      = 2821109907456
10^12 - 1 = 999999999999

Диапазон [0-9a-z]{8} больше 10^12 - 1.Тривиальная хеш-функция состояла бы в том, чтобы преобразовать ваше число из базы 10 в базу 36 и левый падд с 0 до требуемой длины.

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

Если это не удовлетворяет вашим требованиям, вам нужно получить более конкретную информацию.

...