Помощник
|
Генерация уникального набора символов |
alexdrob
|
Сообщение
#1
|
||
|
|
||
|
|||
Arks |
25.5.2012, 23:45;
Ответить: Arks
Сообщение
#2
|
|
Хм.. обратное так уже неинтересно.. ну думаю как вариант сгенерировать цифровой массивчик случайный по 1-255(ну или какой там диапазон Вам нужен такой и берите интервалами), потом перевести его в ASCII-символы(можно прямо в rand указать символьные интервалы), а потом еще зашифровать их xor-ом через ID.. будет быстро и здорово. Хотя нет, не через ID это я погорячился.. просто закрытым ключем. Остается вопрос как связать с ID.. ну тут без base не обойтись вероятно.. хм..
Может проще хранить где-нибудь эту связь и не мучиться вообще с шифрованием. |
|
|
Arks |
25.5.2012, 23:55;
Ответить: Arks
Сообщение
#3
|
|
Это я к тому что используя 1 закрытый ключ в любом случае стойкого алгоритма для ID-чисел типа 1-2...N не получить. Особенно с учетом что алгоритм должен быть расшифровываемым и значения должны быть 8-10 символов.. это ж почти никакой избыточности. В md5 и то коллизии не редкость а rainbow-таблицы включающие все числа без проблем генерятся за час. А там их(символов) аж 32.. вот и думайте.
|
|
|
alexdrob
|
Сообщение
#4
|
|
|
|
|
Arks |
26.5.2012, 0:05;
Ответить: Arks
Сообщение
#5
|
|
В общем просто xor'те закрытый ключ с ID, предварительно сдвинув ID влево до нужного количества байт и будет Вам счастье.. ничего умнее в голову не приходит.
|
|
|
r3ntg3n |
26.5.2012, 0:39;
Ответить: r3ntg3n
Сообщение
#6
|
|
Как на счет того, чтобы заюзать криптографическое расширение mcrypt? Тут вам и закрытые ключи, DES, Blowfish, AES (RIJNDAEL). А если результат еще и в base64_encode(), ИМХО, красиво будет ^_^
|
|
|
Arks |
26.5.2012, 0:45;
Ответить: Arks
Сообщение
#7
|
|
это уже нюансы.. там же еще и reduce длины надо учитывать.. вот получите вы после того же RIJNDAEL нечто зашифрованное, потом прогоните через base64.. разьве это будет 8-10 символов? Или как?
|
|
|
alexdrob
|
Сообщение
#8
|
|
Вообщем вот что накодил. Мб кому пригодится.
[PHP]<?php class CodeGen { private $alphabet = 'taiZVmJHsuygMYqefSKNrb3F9hvE5GC1Bk7Udxp2QXAWcTz4nRLoP86Dwj0'; private $len = 0; private $ar = array(); private $salt = array(10, 35, 12, 11, 3, 5); private $diff = 0; public function __construct() { $this->len = strlen($this->alphabet); } private function set($n, $v) { $pos = $n + $this->diff; $this->ar[$pos % count($this->salt)] = $v; } private function get($n) { $pos = $n + $this->diff; return $this->ar[$pos % count($this->salt)]; } public function id($id) { $b1 = ($id >> 24) & 0xFF; $b2 = ($id >> 16) & 0xFF; $b3 = ($id >> 8) & 0xFF; $b4 = $id & 0xFF; $b51 = floor($b1 / $this->len); $b52 = floor($b2 / $this->len); $b61 = floor($b3 / $this->len); $b62 = floor($b4 / $this->len); $this->diff = $id % count($this->salt); $this->set(0, $b1 % $this->len); $this->set(1, $b2 % $this->len); $this->set(2, $b3 % $this->len); $this->set(3, $b4 % $this->len); $this->set(4, ($b51 << 3) | $b52); $this->set(5, ($b61 << 3) | $b62); return $this; } public function code($code) { $this->diff = strpos($this->alphabet, $code{strlen($code)-1}); for ($i = 0; $i < strlen($code) - 1; $i++) { $pos = strpos($this->alphabet, $code{$i}); $pos = $pos < $this->salt[$i] ? $this->len + $pos : $pos; $this->ar[$i] = $pos - $this->salt[$i]; } return $this; } public function getId() { $b1 = $this->get(0); $b2 = $this->get(1); $b3 = $this->get(2); $b4 = $this->get(3); $b51 = ($this->get(4) & 0x38) >> 3; $b52 = $this->get(4) & 0x07; $b61 = ($this->get(5) & 0x38) >> 3; $b62 = $this->get(5) & 0x07; $b1 += $this->len * $b51; $b2 += $this->len * $b52; $b3 += $this->len * $b61; $b4 += $this->len * $b62; return ($b1 << 24) | ($b2 << 16) | ($b3 << 8) | $b4; } public function getCode() { $res = ''; for ($i = 0; $i < count($this->ar); $i++) { $res .= $this->alphabet{($this->ar[$i]+$this->salt[$i]) % $this->len}; } $res .= $this->alphabet{$this->diff}; return $res; } public function __toString() { return 'array(' . implode(', ', $this->ar) . ')'; } } $cg = new CodeGen; $res = array(); for ($i = 0; $i < 100; $i++) { $res[$cg->id($i)->getCode()] = ''; } $res2 = array(); foreach (array_keys($res) as $item) { $res2[$cg->code($item)->getId()] = ''; } if (0) { $c = count($res); var_dump($c); $c = count($res2); var_dump($c); } else { var_dump($res); var_dump($res2); }[/PHP] |
|
|
alexdrob
|
Сообщение
#9
|
|
|
[PHP]$cg = new CodeGen;
$res = array(); for ($i = 0; $i < 1000000; $i++) { $res[$cg->id($i)->getCode()] = ''; } $res2 = array(); foreach (array_keys($res) as $item) { $res2[$cg->code($item)->getId()] = ''; } if (1) { $c = count($res); var_dump($c); $c = count($res2); var_dump($c); } else { var_dump($res); var_dump($res2); }[/PHP] вот такой запуск показал int 1000000 int 1000000 то есть повторений их миллиона записей не было. то есть ID видимо из кодов тоже верно получились.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Нужен исполнитель на постоянную основу для набора небольших текстов | 20 | Думающий | 9341 | 2.4.2024, 18:05 автор: Думающий |
|
Рерайт / копирайт от исполнителя с опытом. от 45 р за 1k символов услуги рерайта и копирайта |
8 | rest2011 | 3548 | 21.4.2021, 13:34 автор: rest2011 |
|
Настройка таргетированной рекламы Facebook+ Instagram, VK. Генерация лидов | 0 | papic | 819 | 1.2.2021, 8:32 автор: papic |
|
Нужны уник описания к видео (адалт), 10-15 руб. за 1 описание 250 - 350 символов Либо скачивание видео, загрузка на сайт через фтп, + мета-описания |
4 | Admiral_ukr | 2155 | 1.2.2021, 1:18 автор: underkio |
|
ИЩУ: Написание текстов по 400 символов (рерайт) по 10 руб | 1 | tatrus | 932 | 3.1.2021, 21:02 автор: acabgirl |
Текстовая версия | Сейчас: 26.4.2024, 5:05 |