Хеш-функция, возвращающая значение от -1 до 1 - PullRequest
2 голосов
/ 25 октября 2010

Я ищу хеш-функцию, которая принимает в качестве входных данных любое целое число (положительное или отрицательное, хотя оно может быть ограничено диапазоном int, если это облегчает задачу) и возвращает действительное число от -1 до 1. есть такая функция или какой-то очевидный способ построить ее из другой хеш-функции?

Функция не должна быть безопасной, если она достаточно «случайная». Бонусные баллы, если существует реализация C / C ++.

Ответы [ 4 ]

5 голосов
/ 25 октября 2010
  1. Выберите любую хеш-функцию для целых чисел, например, boost :: hash ,
  2. нормализует результат до 2 путем деления на половину максимального значения целого числа
  3. Вычесть 1.

Вот быстрый взлом для демонстрации:

#include<stdio.h>

double inthash(unsigned int key)
{
  key += (key << 12);
  key ^= (key >> 22);
  key += (key << 4);
  key ^= (key >> 9);
  key += (key << 10);
  key ^= (key >> 2);
  key += (key << 7);
  key ^= (key >> 12);
  return key / 2147483647.5 - 1;
}

void main()
{
  printf("%f\n", inthash(1));
  printf("%f\n", inthash(2));
  printf("%f\n", inthash(3));
  printf("%f\n", inthash(10000));
  printf("%f\n", inthash(10001));
}

Выход:

0.368240
-0.263032
-0.892034
-0.428394
-0.150713
3 голосов
/ 25 октября 2010

Что вы подразумеваете под «случайным»?
Вы всегда можете разделить свое целое число на максимальное значение int и получить значение от -1 до 1.

РЕДАКТИРОВАТЬ:

перед нормализацией вы можете сделать что-то вроде

num = num^397;

и затем разделить на макс. Int.

0 голосов
/ 26 октября 2010

Фрагмент кода double hash(int val) { return val / (double)INT_MAX; } содержит ошибку, поскольку INT_MIN равен -2147483648, а INT_MAX равен 2147483647, поэтому INT_MIN / INT_MAX <-1. </p>

0 голосов
/ 25 октября 2010

Нет ничего проще, чем это. Работает на любое неотрицательное число. С небольшими изменениями могут поддерживаться также отрицательные целые числа.

double hash(int val)
{
    return val / ((double)INT_MAX / 2.0) - 1.0;
}

РЕДАКТИРОВАТЬ: Это должно работать для всех чисел (положительных и отрицательных):

double hash(int val)
{
    return val / (double)INT_MAX;
}

Да, это так же тривиально, как выглядит (будет точнее, если вы используете -INT_MIN для отрицательных чисел).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...