Генерация 10-значных пин-кодов

Vallar_ultra

Любитель выпить :)
Генерация 10-значных пин-кодов

Граждане, есть такой вопрос: надо генерировать большой объём пин-кодов размерностью 10 знаков. Для того чтобы исключить похожие я додумался только до того чтобы представить их как точки в n-мерном пространстве с размерностью 10 и осями от 0 до 9. Похожесть между двумя пинами определяется длинной вектора пин1-пин2. Вопрос в следующем: т.к. операцию сравнения приходится проводить множество раз - то каким образом вообще можно оптимизировать данный процесс?
 

Vallar_ultra

Любитель выпить :)
2440hz

Да, это понятно, там они в результате и живут, только вот когда уже есть 20000 пинов и надо догенерить ещё 2000 - то обём операция 20000*2000 = 40000000 что немного тяжеловато учитывая то что каждый раз приходится считать вектор в n-мерном пространстве.

2tony2001

1026587982 и 1037587982 похожи (теоретически зная первый можно подобрать второй)
 

440hz

php.ru
Vallar_ultra


1. генерируешь пин рандомайзом (или есть правила генерации?)
2. проверяешт его в базе (поле первичный ключ). mysql на 20000 даже не напряжется.
3. если нету - вставляешь
4. если есть, см. пункт 1

что сложного-то? и нафиг вектора?
 

whirlwind

TDD infected, paranoid
> каждый раз приходится считать вектор в n-мерном пространстве

а если сохранять компоненты вектора для каждого пина в момент генерации?
 

nerezus

Вселенский отказник
10**10 — количество возможных пинов
4 * 10**3 — количество пинов
Делим второе число на первое:
4 * 10**(-7) — вероятность подбора пина.
 

Vallar_ultra

Любитель выпить :)
2440hz
всё ок, но рандомайз похожие пины иногда даёт, но редко правда :)))))

2whirlwind
Так и происходит :))))

2nerezus
Я вкурсе, тут не вопрос вероятности подбора, а вопрос о том что можноли сй процесс в условиях данной системы оптимизировать :)
 

whirlwind

TDD infected, paranoid
Vallar_ultra ну дык а что там такого грандиозного в расчетах. Налету считаешь дельту, возводишь в квадраты, складываешь, сравниваешь с допустимым значением. В конктексте базы все это сводится к определению колва записей, которые меньше указанного предела. Ни одной медленной операции. На каждый новый пин по запросу. В онлайн такую обработку конечно не засунешь... но в общем то и задача из разряда долгоиграющих.

А ломать голову по поводу оптимизаций... оно надо? Уж явно не автомобили выдаете по этим пинам. Если уж где и "оптимизировать", то на этапе ввода - не давать злодеям неограниченного колва попыток ввода. Вот где то так...
 

ksnk

прохожий
...длинной вектора пин1-пин2...
Длина вектора исчисляется суммой квадратов разности координат или суммой абсолютов?

Для уменьшения перебора можно разбить 10-и мерный куб на пересекающиеся квадратные кусочки, определять в какой кусочек попал пин и перебирать только те, кто сидит там-же. Соответственно в базе для каждого пина нужно бы хранить/ перевычислять номера кусочков...
 

whirlwind

TDD infected, paranoid
> 10-и мерный куб

Вот эт воображение. Не могу себе представить :D

Vallar_ultra тогда уж на полуоси. И на каждую ось по биту. А отбирать по маске. Только это не спасет. Потому что длина - понятие относительное.
 

ksnk

прохожий
Андрейка
[флейм]И что вы предлагаете настолько быстро двигать? :) [/флейм]
 

phprus

Moderator
Команда форума
ksnk
[флейм]Ну раз речь идет о длинне вектора, то я думаю, что Андрейка предлагает двигать с такой скоростью сам вектор.[/флейм]

-~{}~ 18.09.06 23:54:

Vallar_ultra
Нет это специальная теория относительности.
 

phprus

Moderator
Команда форума
Vallar_ultra
Сорри. Я просто немного перезанимался сегодня (в ВУЗе и после дома). Вот и подумал, что ты не знаешь, что такое СТО.
 
Сверху