Как я создаю уникальные идентификаторы, как YouTube?

Если вы продолжаете выделять & amp; сохраняя ссылки на объект, вы будете заполнять любой объем памяти, который у вас есть.

Один из вариантов - сделать прозрачный файл закрыть & amp; открывать, когда они переключают вкладки (вы сохраняете только указатель на файл, а когда пользователь переключает вкладку, вы закрываете и очищаете все объекты ... это замедляет изменение файла ... но ...), и, возможно, хранить только 3 или 4 файла в памяти.

Другая вещь, которую вы должны сделать, это когда пользователь открывает файл, загружает его и перехватывает любую ошибку OutOfMemoryError, затем (поскольку открыть файл невозможно) закрывает этот файл, очищает его объекты и предупреждает пользователя о том, что он следует закрыть неиспользуемые файлы.

Ваша идея динамического расширения виртуальной памяти не решает проблему, поскольку машина ограничена в ресурсах, поэтому вы должны быть осторожны и осторожны. решать проблемы с памятью (или, по крайней мере, быть осторожным с ними). ​​

Вот несколько советов, которые я видел с утечками памяти:

-> Имейте в виду, что если вы положили что-то в коллекцию, а потом забыли об этом, у вас все равно будет сильная ссылка на нее , так что аннулируйте коллекцию, очистите ее или сделайте что-нибудь с ней ... если нет, то вам будет трудно обнаружить утечку памяти.

-> Возможно, использование коллекций со слабыми ссылками (weakhashmap ...) может помочь с проблемами памяти, но вы должны быть осторожнее с этим, поскольку вы можете обнаружить, что объект, который вы ищете, имеет были собраны.

-> Еще одна идея, которую я нашел, - разработать постоянную коллекцию, которая хранится в наименее используемых и прозрачно загруженных объектах базы данных. Это, вероятно, будет лучшим подходом ...

21
задан Digerdoden 2 July 2009 в 19:22
поделиться

10 ответов

Попробуйте следующее: http://php.net/manual/en/function.uniqid.php

uniqid - Создайте уникальный идентификатор ...

Получает уникальный идентификатор с префиксом, основанный на текущем времени в микросекундах.

Внимание Эта функция не генерирует криптографически безопасные значения и не должна использоваться в криптографических целях. Если вам нужно криптографически безопасное значение, рассмотрите возможность использования random_int () , random_bytes () или openssl_random_pseudo_bytes () взамен.

Предупреждение Эта функция не гарантирует уникальность возвращаемого значения. Поскольку большинство систем регулируют системные часы с помощью NTP или подобного, системное время изменяется постоянно. Следовательно, возможно, что эта функция не возвращает уникальный идентификатор для процесса / потока. Используйте more_entropy , чтобы увеличить вероятность уникальности ...

18
ответ дан 29 November 2019 в 06:22
поделиться

base62 или base64 кодируют значение вашего первичного ключа, а затем сохраняют его в другом поле.

пример base62 для первичного ключа 12443 = 3eH

экономит место, поэтому я уверен, что YouTube используя его.

выполнение кодирования base62 (A-Za-z0-9) на вашем ПК или уникальном идентификаторе предотвратит накладные расходы, связанные с необходимостью проверки, существует ли уже ключ :)

9
ответ дан 29 November 2019 в 06:22
поделиться

Автоинкремент можно легко сканировать. Их невозможно предсказать, и поэтому их нельзя сканировать последовательно.

Я предлагаю использовать формат с двумя URL-адресами (аналогично URL-адресам SO):

yoursite.com/video_idkey/url_friendly_video_title

Если вам требовались и идентификатор, и заголовок в URL-адресе, вы затем можно использовать простые числа, такие как 0001, 0002, 0003 и т. д.

Генерация этих ключей может быть очень простой. Вы можете использовать функцию uniqid () в PHP для генерации 13 символов или 23 с большей энтропией.

4
ответ дан 29 November 2019 в 06:22
поделиться

Если вам нужны короткие URL-адреса и предсказуемость не является проблемой, вы можете преобразует автоматически увеличивающийся ID в более высокое основание .

3
ответ дан 29 November 2019 в 06:22
поделиться

Это можно сделать с помощью хеш-функции с уникальным вводом каждый раз.

пример (вы пометили вопрос с помощью php, следовательно):

$uniqueID = null
do {
  $uniqueID = sha1( $fileName + date() );
} while ( !isUnique($uniqueID) )
2
ответ дан 29 November 2019 в 06:22
поделиться

Во многом это зависит от того, что вам нужно делать. Насколько «уникальный» уникален? Вы обслуживаете уникальные идентификаторы, и означают ли они что-то в вашей БД? в таком случае последовательный # может подойти.

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

Существуют команды файловой системы, которые генерируют уникальные имена файлов. - вы можете использовать их.

Или GUID.

1
ответ дан 29 November 2019 в 06:22
поделиться

Рассмотрите возможность использования чего-то вроде:

$ id = base64_encode (md5 (uniqid (), true));

uniqid предоставит вам уникальный идентификатор. MD5 рассеивает его, давая вам 128-битный результат. Кодировка Base 64, которая даст вам 6 бит на символ в идентификаторе, подходящем для использования в Интернете, весом около 23 символов и трудноразрешимым с точки зрения вычислений угадыванием. Если вы хотите быть еще более параноиком, переходите с md5 на sha1 или выше.

2
ответ дан 29 November 2019 в 06:22
поделиться

Для генерации этих идентификаторов должна быть библиотека PHP. Если нет, то это несложно реализовать.

Преимущество состоит в том, что позже у вас не будет конфликтов имен, когда вы попытаетесь реорганизовать или объединить различные ресурсы сервера. С числовыми идентификаторами вам придется изменить некоторые из них, чтобы разрешить конфликты, и это приведет к изменению URL, что приведет к попаданию в SEO.

1
ответ дан 29 November 2019 в 06:22
поделиться

Результаты хэш-функций, например SHA-1 или MD5 и GUID имеют тенденцию становиться очень длинными, что, вероятно, вам не нужно. (Вы специально упомянули YouTube в качестве примера: их идентификаторы остаются относительно короткими даже с миллиардами видео, которые они размещают.)

Вот почему вы можете захотеть преобразовать свои числовые идентификаторы, которые вы используете за кулисами , в другую базу при помещении их в URL-адреса. Например, Flickr использует Base58 для своих канонических коротких URL. Подробности об этом доступны здесь: http://www.flickr.com/groups/api/discuss/72157616713786392/ . Если вы ищете универсальное решение, обратите внимание на пакет PEAR Mathe_Basex.

1
ответ дан 29 November 2019 в 06:22
поделиться

Я не У меня нет формулы, но мы делаем это в проекте, над которым я работаю. (Я не могу этим поделиться). Но в основном мы генерируем по одному символу и добавляем строку.

Когда у нас есть завершенная строка, мы сверяем ее с базой данных. Если нет другого, мы идем с ним. Если это дубликат, мы начинаем процесс заново. Не очень сложно.

Преимущество, я полагаю, заключается в GUID .

0
ответ дан 29 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: