2014-10-08 4 views
-2

Я работаю над созданием уникальных GID и хотел бы получить любое мнение по следующему коду. Идея заключается в том, что она должна выдавать идентификатор, который уникален для определенного IP в течение периода времени в 1 секунду (помогает предотвратить несколько сообщений) и быть как можно короче.Создание уникальных GID

Вот код в PHP:

$gid = base_convert(dechex(str_replace(".", "", $_SERVER['REMOTE_ADDR'])) . dechex(time()), 10, 36); 

Это производит идентификаторы, такие как эти:

qdkgzfvim 
4ge6gesv 
cztme7e4t 
45qqcvq 

Любое мнение относительно того, будет ли это создавать уникальные идентификаторы? Могут ли быть столкновения? Должен ли я заполнять цифры с помощью 0s?

+3

Вы понимаете, что многие ПК могут использовать один и тот же IP-адрес? –

+0

Первичная фильтрация распространена для веб-служб. REMOTE_ADDR можно заменить идентификатором пользователя в случае зарегистрированного пользователя. Или, если он используется для генерации идентификаторов пользователей, то это предотвратит регистрацию двух человек из одного и того же IP-адреса с той же секунды ... – Dendory

+0

Я больше думаю о системе комментариев или для создания идентификаторов для пользователей и других подобных вещи, в которых вы не ожидаете, что кто-то из вас будет генерировать два элемента за одну секунду. Время() - это простой способ сделать его уникальным навсегда, поскольку он будет продолжать увеличиваться. Мой вопрос больше меняется с int на hex и затем на base36, он лишает уникальности ... – Dendory

ответ

1

Выполнить тест:

$part2 = dechex(time()); 

echo '<br/>' . $part2; 

echo '<br/>' . base_convert($part2, 10, 36); 

echo '<br/>' . base_convert(base_convert($part2, 10, 36), 36, 10); 

Производит что-то вроде:

5435a0e0 
bnd8 
543500 

Its потери данных. Поэтому он не обратим, поэтому он может потерять предполагаемую уникальность.

+0

Вот такой ответ, который я ищу. Не следует ли базовое преобразование * не * потерять данные, тo? Я предполагаю, что это связано с тем, как base_convert() работает внутренне, поскольку он явно не принимает каждую цифру отдельно? Любой способ создать функцию, которая будет конвертировать в буквенно-цифровом (с целью сокращения длины строки), но не потерять данные? – Dendory

+0

@Dendory - Зачем беспокоиться о сокращении на 10 байт? Это микро-оптимизация, и люди, как правило, теряют большую картину. КСТАТИ. Время предсказуемо, так же как и этот алгоритм. –

+0

Решил, спасибо, что указал на этот тест. Проблема в том, что эти ** 10 ** должны быть ** 16 **. Тогда он уникален и останется уникальным независимо от времени или IP. – Dendory

Смежные вопросы