PHP функция для получения одинакового выхода в зависимости от входа - PullRequest
2 голосов
/ 18 апреля 2020

У меня более 30.000 предметов (в виде строки). И у меня есть массив с 10 элементами. Я хочу связать каждый элемент с элементом массива. Таким образом, более или менее 3000 элементов будут связаны с первым элементом, 3000 элементов - со вторым элементом и т. Д. c ... Это должно быть случайным, но функция всегда должна назначать один и тот же вывод в зависимости от ввода. Например, каждый раз, когда мы запускаем функцию, строка «345hdsf» должна быть связана с одним и тем же элементом массива. И строка «oiu85dsf» может быть связана с другой (но каждый раз одна и та же).

Входная строка может быть любой строкой. Я не знаю значения входных строк и могу увеличить количество строк во времени.

Возможно ли это с PHP? Может быть, мне нужно использовать какой-нибудь метод шифрования?

1 Ответ

4 голосов
/ 18 апреля 2020

Ваше ключевое требование здесь состоит в том, чтобы процесс повторялся . Это может выглядеть случайным для человека, но процесс определения того, в какой «сегмент» попадает каждый элемент, очень нуждается в стабильности.

То, что вы ищете (как люди упоминали в комментариях): функция хеширования, которая выдаст одну из 10 ключей - необходимое вам количество сегментов. Самый простой способ сделать это с помощью PHP - это взять остаток от crc32 га sh мод 10:

$key = crc32($string) % 10;

Затем вы можете назначить элемент к этому сегменту в выводе:

$buckets = [];

foreach ($strings as $string) {
    $key = crc32($string) % 10;

    $buckets[$key][] = $string;
}

См. https://3v4l.org/enEEV

Результаты не идеальны ни при каких условиях (в этом примере сегменты имеют От 5 до 14 элементов), но он будет выровнен с большими входными размерами. Подсчет ведра для 30 000 элементов выглядит следующим образом:

0 - 3099
1 - 3085
2 - 2930
3 - 2975
4 - 2983
5 - 2969
6 - 2981
7 - 2987
8 - 2921
9 - 3070
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...