X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Генерация уникального набора символов
alexdrob
alexdrob
Topic Starter сообщение 25.5.2012, 23:23; Ответить: alexdrob
Сообщение #1


Есть ли готовые реализации? Не могу нагуглить или просто не знаю как :) Как это хоть называется?

Суть в том, что нужно сделать случайный, уникальный код. В зависимости от ID.
Код должен быть из 0-9A-Za-z
Длинной примерно 6 -10 символов.
Но вариант типа base58_encode не подходит, так как там слишком прост алгоритм.
0 - 1
1 - 2
...
9 - a
10 - b
Зная код, например 12Fa можно догадаться что следующий будет 12Fb.
Даже если перемешать символы в исходном алфавите, то имея 2 кода, всё равно получим с лёгкостью третий.

Да и возрастание кода там от одного символа.
Хотелось бы рандом, что бы первый напрмиер
S4gwAd2e
а второй
6Ogw34W

ps мне и обратное преобразование желательно :)
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 25.5.2012, 23:45; Ответить: Arks
Сообщение #2


Хм.. обратное так уже неинтересно.. ну думаю как вариант сгенерировать цифровой массивчик случайный по 1-255(ну или какой там диапазон Вам нужен такой и берите интервалами), потом перевести его в ASCII-символы(можно прямо в rand указать символьные интервалы), а потом еще зашифровать их xor-ом через ID.. будет быстро и здорово. Хотя нет, не через ID это я погорячился.. просто закрытым ключем. Остается вопрос как связать с ID.. ну тут без base не обойтись вероятно.. хм..
Может проще хранить где-нибудь эту связь и не мучиться вообще с шифрованием.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 25.5.2012, 23:55; Ответить: Arks
Сообщение #3


Это я к тому что используя 1 закрытый ключ в любом случае стойкого алгоритма для ID-чисел типа 1-2...N не получить. Особенно с учетом что алгоритм должен быть расшифровываемым и значения должны быть 8-10 символов.. это ж почти никакой избыточности. В md5 и то коллизии не редкость а rainbow-таблицы включающие все числа без проблем генерятся за час. А там их(символов) аж 32.. вот и думайте.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 25.5.2012, 23:57; Ответить: alexdrob
Сообщение #4


Ну можно хранить, именно по этому я написал
(alexdrob @ 26.5.2012, 02:23) *
желательно

Но не обязательно :)

Но как добиться уникальности? Не хотелось бы при вставке проверять на уникальность и перегенирировать.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 26.5.2012, 0:05; Ответить: Arks
Сообщение #5


В общем просто xor'те закрытый ключ с ID, предварительно сдвинув ID влево до нужного количества байт и будет Вам счастье.. ничего умнее в голову не приходит.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
r3ntg3n
r3ntg3n
сообщение 26.5.2012, 0:39; Ответить: r3ntg3n
Сообщение #6


Как на счет того, чтобы заюзать криптографическое расширение mcrypt? Тут вам и закрытые ключи, DES, Blowfish, AES (RIJNDAEL). А если результат еще и в base64_encode(), ИМХО, красиво будет ^_^
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 26.5.2012, 0:45; Ответить: Arks
Сообщение #7


это уже нюансы.. там же еще и reduce длины надо учитывать.. вот получите вы после того же RIJNDAEL нечто зашифрованное, потом прогоните через base64.. разьве это будет 8-10 символов? Или как?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 26.5.2012, 4:05; Ответить: 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
alexdrob
Topic Starter сообщение 26.5.2012, 4:16; Ответить: 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 видимо из кодов тоже верно получились.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Нужен исполнитель на постоянную основу для набора небольших текстов
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


 



RSS Текстовая версия Сейчас: 26.4.2024, 5:05
Дизайн