Контрольная сумма из id
293 повідомлення
#12 років тому
Здравствуйте, Имеется айди пользователя вконтакте и имеется число картинок, например 20. какой алгоритм можно использовать чтобы сопоставить каждому идентификатору свой номер картинки от 0 до 20, при этом чтобы был как можно более рандомный, но на каждого пользователя одинаковый.думал о циклическом сложении цифр айди, с заменой знака на вычитание после 20 и сложения после нуля, но мне кажется что всё равно картинки будут разделяться между юзерами не равномерно.
2989 повідомлень
#12 років тому
На каком языке-то? Какие требования к результату?md5(uniqid(ид_юзера + номер_картинки, true));
6863 повідомлення
#12 років тому
Отбросить одну-две-три последние цифры, найти остаток от деления на 20
293 повідомлення
#12 років тому
elosoft, язык не имеет значения, вопрос только по алгоритму. требования к результату: однозначно сопоставить каждый айди к номеру от одного до n. при этом желательно чтобы функциональная зависимость была не линейная, с хешем не подходит.floppox, с остатком интересная идея, спасибо.
293 повідомлення
#12 років тому
Еще вопрос, есть тот же айди, нужно с его помощью заполнить 5 полей значениями от 0 до 100. При этом значения должны быть похожи что сделаны рандомом.то есть можно каждому полю назначить корректировочный коэфициент, домноженный например на остаток деления, но тогда у всех пользователей между собой параметры будут находится в прямой зависимости, можно ли как то тут добиться нужного результата?
16382 повідомлення
#12 років тому
FaradayStudio, можно для каждого поля предусмотреть свой делитель и получаемый остаток от деления писать в поле.
293 повідомлення
#12 років тому
Тогда делитель и будет максимальным значением для этого поля, а значения в каждом должны варьироваться в одинаковом пределе.
293 повідомлення
#12 років тому
Хотя можно конечно при этом к результату плюсовать константу как (100-делитель), но всё равно вариативность значений между полями будет слишком линейная.
6863 повідомлення
#12 років тому
Делите айди по две цифры, переставляетее их местами, получаете практически случайные числа. Можно брать более сложные комбинации цифр.
Например - первая и третья с конца, вторая и пятая, четвертая и шестая и т.д. Только првязываться к концу айди надо.
293 повідомлення
#12 років тому
Да, тоже думал делить айди по две цифры, но всего нужно 7 полей, то есть идентификаторы все должны быть > 14 знаков. щас вот подумал что можно будет делить 99999999999999 на идентификатор, чтобы получалось дробное число, потом его уже конвертировать в строку и если кол-во знаков больше 14 бить по парам, если нет то увеличивать айди на единицу и заново до тех пор пока.. что думаете?
16382 повідомлення
#12 років тому
FaradayStudio, мое мнение - строки не надо сюда вмешивать. Не правильно это. Почитайте про crc, может быть там есть то, что вам нужно.
293 повідомлення
#12 років тому
frig,читал уже, но там решаются другие задачи. а чем может быть плох способ со строкой? пока подводных камней не вижу..
16382 повідомлення
#12 років тому
FaradayStudio, способ со строкой плох с идеологической точки зрения.
6863 повідомлення
#12 років тому
frig, работа со строкой - по сути, более наглядная замена алгоритма с разбиением на разряды. И лучше, действительно, разбивать делением на десять, сто, тысячу и т.д. Но объяснить "на пальцах" проще через строки.
6863 повідомлення
#12 років тому
А как без конвертации? приходит-то строка, еще и с буквами "id". А получить надо числа.
16382 повідомлення
#12 років тому
floppox, в данном случае понятно. А вот потом числа конвертировать в строки, делать операции со строками, потом опять делать из них числа - это не по мне. Если это можно сделать математикой - надо это делать математикой. А двойные преобразования в данном случае - больше будут похожи на шаманство. Особенно через пол года. И со стороны.
293 повідомлення
#12 років тому
floppox, приходит без id, одни цифры.frig, ну разбивать математически как остатки от деления на степени 10-ки помоему менее очевидны.
вот нашёл решение на javascript похожей задачи посилання
но тут ,как я понимаю, хеш вычисляется из ссылки на аватар, вот только понять суть и эффективность способа сразу не получается.
$(data.response).each(function(k, el) {
var hash = el.photo_big.substr(strpos(el.photo_big,'a_')+2,8);
var persents, rating = 0;
var rate = ;
for (var i=0;i<8;i++) {
persents = Math.ceil(100/15*parseInt(hash.substr(i,1),16));
if (!persents) persents = 50;
rate = persents;
rating+=persents;}