22.04.2013, 20:38
|
Профессор
|
|
Регистрация: 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
|
|
23.04.2013, 05:17
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от with-love-from-siberia
|
Base64.
Только зачем? 36-ричной системы достаточно. Плюсом является полная реализация как на php, так и на js.
|
Base64 только усугубит.
36-ричной системы действительно достаточно, НО
есть же возможность сделать еще лучше.
Ну да ладно. мне уже ответили, спасибо
|
|
23.04.2013, 05:20
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от Mukhtar
|
Можно на 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
|
если ставить id в название то 100% повторов не будет, не обязательно так извращаться + не надо хранить название файла, а это экономия
Целью моего обращение являлось именно системы счисления.
|
|
23.04.2013, 05:21
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от rgl
|
В шестом IE скобочки [] со строкой могут не работать, но можно заменить на charAt()
|
спрашивая "противопоказания" имел ввиду что-то подобное.
благодарен за быстрый ответ и рабочие функции
|
|
23.04.2013, 09:34
|
Профессор
|
|
Регистрация: 14.12.2009
Сообщений: 155
|
|
Сообщение от RazZzeR
|
36-ричной системы действительно достаточно, НО
есть же возможность сделать еще лучше.
|
Понимаю, что Вы уже удовлетворены предыдущими ответами. Тем не менее добавлю еще свои пять копеек. 36-ричной системы действительно достаточно.
Отказавшись от основания 36 в пользу более высокого основания (62 или 64) Вы не сделаете лучше. Ощутимой экономии Вы не получите, но добавите необходимость в дополнительной поддержке четырех нестандартных функций (по две в php и js - конвертация числа в строку и обратно).
Оценить разрядности числа в той или иной системе счисления можно по такой формуле
Math.ceil(Math.log(n) / Math.log(base))
. Здесь, n - число, base - основание системы счисления.
Вот грубые оценки. Для представления числа 1e6 необходимо по 4 позиции во всех системах по основаниям 36, 62 и 64. И только для 1e9 в системе по основанию 64 требуется 5 позиций, в то время как в системах по основанию 36 и 62 - по прежнему 6. Более точные оценки Вы можете проделать сами. У Вас действительно так много идентификаторов - больше 1 миллиона, что встала необходимость в незначительном укорочении идентификатора такой большой ценой?
Вот минимальный алгоритм конвертации в любую систему счисления по основанию не выше 64 без проверок корректности входных данных.
var ciphers = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
function radixConv(n, base)
{
var result = [];
while ( n ) {
var r = ciphers.charAt(n % base);
result.push(r);
n = Math.floor(n / base);
}
return result.reverse().join('');
};
// Проверка реализации
var n = 1e6;
alert([
n,
n.toString(10), radixConv(n, 10),
n.toString(16), radixConv(n, 16),
n.toString(36), radixConv(n, 36),
].join('\n'));
// Иллюстрация для 1e6
var n = 1e6;
alert([
n,
radixConv(n, 36),
radixConv(n, 62),
radixConv(n, 64),
].join('\n'));
// Иллюстрация для 1e9
var n = 1e9;
alert([
n,
radixConv(n, 36),
radixConv(n, 62),
radixConv(n, 64),
].join('\n'));
|
|
23.04.2013, 16:15
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от with-love-from-siberia
|
Понимаю, что Вы уже удовлетворены предыдущими ответами. Тем не менее добавлю еще свои пять копеек. 36-ричной системы действительно достаточно.
Отказавшись от основания 36 в пользу более высокого основания (62 или 64) Вы не сделаете лучше. Ощутимой экономии Вы не получите, но добавите необходимость в дополнительной поддержке четырех нестандартных функций (по две в php и js - конвертация числа в строку и обратно).
Оценить разрядности числа в той или иной системе счисления можно по такой формуле
Math.ceil(Math.log(n) / Math.log(base))
. Здесь, n - число, base - основание системы счисления.
Вот грубые оценки. Для представления числа 1e6 необходимо по 4 позиции во всех системах по основаниям 36, 62 и 64. И только для 1e9 в системе по основанию 64 требуется 5 позиций, в то время как в системах по основанию 36 и 62 - по прежнему 6. Более точные оценки Вы можете проделать сами. У Вас действительно так много идентификаторов - больше 1 миллиона, что встала необходимость в незначительном укорочении идентификатора такой большой ценой?
Вот минимальный алгоритм конвертации в любую систему счисления по основанию не выше 64 без проверок корректности входных данных.
|
Вот теперь я понял тебя, большое спасибо за развернутый ответ, отличную рекомендацию.
напомню, что я порой часто заказываю скрипты у активных пользователей форума,
могу ли я обращаться к вам, rgl и with-love-from-siberia?
|
|
23.04.2013, 20:16
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Маленькое предупреждение - при количестве десятичных цифр больше 15 уже не будет хватать точности представления чисел, поэтому правильно работать не будет.
|
|
23.04.2013, 22:43
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от danik.js
|
А смысл?
|
я тоже не оценил
Сообщение от RazZzeR
|
если ставить id в название то 100% повторов не будет
|
sql auto-increment чем не угодил?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 23.04.2013 в 22:45.
|
|
24.04.2013, 12:51
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от nerv_
|
sql auto-increment чем не угодил?
|
угодил, угодил
|
|
24.04.2013, 13:01
|
|
Кандидат Javascript-наук
|
|
Регистрация: 11.12.2011
Сообщений: 146
|
|
Сообщение от rgl
|
Маленькое предупреждение - при количестве десятичных цифр больше 15 уже не будет хватать точности представления чисел, поэтому правильно работать не будет.
|
спасибо.
100.000.000.000.000
100 тысяч миллиардов (не знаю как называется).... миллиард картинок представить трудно, думаю до сотни тысяч то не доживу
|
|
|
|