используя php, чтобы назначить одно из набора значений на любой вход последовательно - PullRequest
1 голос
/ 15 ноября 2009

Для примера у меня есть два поля ввода, называемые A и B.

Что я хочу, так это каким-то образом получить хеш или сумму этих входных данных и передать их в функцию php, которая даст мне один из результатов, но последовательно.

Вот что я думаю должно выглядеть

псевдокод

$a = $_POST[a];
$b = $_POST[b];

$pre = "$a$b";
// Put both inputs together as a single string

$hash = mashup($pre);
// Do something that creates a "hash" of the inputs given.

$output = magicfunction($hash);
// Takes the "hash" and uses some magic method to match it to a particular output

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

Примером того, о чем я говорю (но не то, что я пытаюсь сделать), являются те сайты, на которых вы вводите свое имя, и оно дает вам какое-то имя новизны, например, имя звездной звезды, имя рок-звезды или что-то еще. Это не просто случайно, если вы введете одно и то же имя, вы получите тот же результат, но разные имена также могут дать вам этот результат.

Ответы [ 4 ]

2 голосов
/ 15 ноября 2009

Звучит так, будто вам нужно что-то вроде md5 () в PHP. Он генерирует уникальную 32-х символьную строку хеша на основе ввода строки любой длины.

Столкновения, когда разные входные данные дают одинаковый хэш, очень редки, но могут произойти, если у вас очень разные входные данные. Если вы хотите увеличить количество совпадений, вы можете просто использовать substr (), например, берите только первые 3 символа хеш-строки.

2 голосов
/ 15 ноября 2009

Я думаю, что самый простой способ - разрешить в строке значение в диапазоне от 0 до 19, которое затем можно найти в массиве. Один из способов сделать это - перебрать $pre и продолжить добавлять значения ascii, а затем в конце сделать «mod 20» для него. Смотри ниже.

function hashup($str,$totalSetSize = 20)
{
    $sum = 0;
    for ($i = 0; $i = strlen($str); $i++)
    {
        $sum += ord($str[$i]);
    }
    return ($sum % $totalSetSize);
}

hashup вернет значение в диапазоне 0-19, которое magicfunction () может просто найти в массиве.

function magicfunction($idx)
{
    return $ROCK_STAR_NAMES[$idx];
}

Хотя в действительности вам не нужна магическая функция, я просто поместил ее здесь, чтобы она соответствовала вашему примеру.

При вышеупомянутом генерировании хэша имена 'a' и 'b' дадут вам следующее имя в ROCK_STAR_NAME. Если вы не хотите, чтобы это было в последовательности, вы должны выполнить $pre=md5("$a$b"), а затем передать его в hashsup.

1 голос
/ 15 ноября 2009

Пересмотрен код для использования Dependency Injection и метода хеширования aip.cd.aish выше:

class Mapper
{
    protected $map = array();

    // Having to pass the map on instantiation allows us to
    // reuse the Mapper class for any map you want.
    public function __construct(array $map)
    {
        $this->map = $map;
    }

    // ** EDIT ** replaced my original hash method 
    // with the one from aip.cd.aish - so kudos to him.
    public function hash($str)
    {
        $sum = 0;
        for ($i = 0; $i = strlen($str); $i++) {
            $sum += ord($str[$i]);
        }
        return $sum;
    }

    public function mapInput($input)
    {   
        $output = $input;
        $items  = count($this->map);
        if($items > 0) {
            $hash   = $this->hash($input);
            $key    = $hash % $items;
            $output = $this->map[$key];
         }
         return $output;
    }        
}

// create new Mapper and pass the map to it.    
$mapper = new Mapper(array('cheese', 'onions', 'pepper', 'garlic', 
                           'tomatoe','sausage', 'ham', 'squid', 
                           'eggs', 'beef'));

echo $mapper->mapInput('Patrick');
1 голос
/ 15 ноября 2009

Прежде всего, вы уверены, что хотите использовать один хэш из нескольких входов (в отличие от одного хэша)?

Независимо от того, что вы можете использовать что-то вроде array_count_values (работает со строками и целыми числами), чтобы создать тривиальный 'хеш', а затем использовать массив диапазонов, чтобы выбрать выход для каждого хеша. Например:

$charHash = array_count_values(str_split($_POST['a'].$_POST['b']));

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

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