Показать сообщение отдельно
  #11 (permalink)  
Старый 22.04.2013, 20:38
Профессор
Отправить личное сообщение для Mukhtar Посмотреть профиль Найти все сообщения от Mukhtar
 
Регистрация: 08.10.2010
Сообщений: 201

Сообщение от RazZzeR Посмотреть сообщение
Доброго времени суток, и заранее благодарю.
Для понимания должно быть просто.

Название пользовательских файлов = id из базы данных + расширение.
Например "123345666677777888.jpg", "887766252523.png"
Хотел бы чуть уменьшить размер названия файла (особенно некрасиво получается когда id уходит за 9, 12 чисел, слишком длинный адрес)


И, думаю, самым ОПТИМАЛЬНЫМ решением является называть файлы в другой системе счисления. (да еще не надо лишнюю информацию о адресе файла хранить в базе при таком раскладе)

Например: "15099" (10) => "bnf" (36) (в итоге: -2 символа)
И большое число: "1000562" (10) => "lg1e" (36) (в итоге: -3символа)
И еще больше: "1000562627" (10) => "gjpj2b" (36) (в итоге: -4символа)
Напомню, что 36ая система представляет из себя набор всех чисел и букв англ. алфавита (0-9, a-z).

Base = {
 to36 : function (a){ // кодируем
  return this.convert(a, 10, 36);
 },
 to10 : function (a){ // обратно
  return this.convert(a, 36, 10);
 },
 convert : function (number, from, to) {
  return parseInt(number + '', from | 0).toString(to | 0);
 }
}

Вот так реализовано на js, вызывать Base.to36(магические_цифры)

на php вот так:
$binary = '1000562627';
echo base_convert($binary, 10, 36);
(третий пример, выведет "gjpj2b")

Цель: нужны функции кодирования (в новую систему счисления и желательно обратно).
Система счисления: цифры (0-9) и англ. алфавит на обоих раскладках (a-z, A-Z).


И забыл уведомить - Base.convert(a, 10, Любое число больше 36);
вызовет ошибку (что не удивительно):
RangeError: toString() radix argument must be between 2 and 36

Возможны ошибки в построении темы (исправлю) - не сплю 2 дня (посплю в аду, которого нет ).

Уверен, что есть подобная реализация (если я буду строить такую функцию, то она уйдет у меня более чем в 50 строк, а это неуместно). В любом случае буду благодарен.
Можно на php использовать time();
Например
$ext = preg_replace('/(?:.*)(\.{1}[a-zA-Z]{3,4})$/','$1', $_FILES['fileupload']['name']);
	$unic_name  = time().'_'.rand(0,1000).$ext;

Тогда названия файлов не будут повторяться, и выводиться так 35465468_789.jpg
Ответить с цитированием