Я хочу извлечь из третьего символа в векторе выше (в частности, извлечь число)
blockquote>Я бы использовал
gsub()
, который находит определенный шаблон и заменяет его.Variables <- c("EA10", "EA14", "EA15") gsub(pattern="\\D", replacement="", Variables) #[1] "10" "14" "15"
pattern="\\D"
соответствует каждому, что не является цифрой (больше здесь )
replacement=""
заменяет его на пустое пространствоВ качестве альтернативы вы, конечно, можете извлечь непосредственно цифры, используя, например,
str_extract()
из пакетаstringr
:stringr::str_extract(string = Variables, pattern = "\\d+") # \\d+ matches multiple digits in the string #[1] "10" "14" "15"
Внутри
data.frame
:df["Variable"] = gsub(pattern="\\D", replacement="", df["Variable"])
или:
df["Variable"] = stringr::str_extract(df["Variable"], pattern="\\d+")
Я нахожу, что простое шифрование XOR подходит лучше всего для путаницы URL. Можно продолжить использовать безотносительно порядкового номера Вы используете без изменения. Далее шифрование XOR не увеличивает длину исходной строки. Если Ваш текст составит 22 байта, то зашифрованная строка составит 22 байта также. Это не достаточно легко, чтобы быть предположенным как гниль 13, но не тяжелый вес как DSE/RSA.
Ищите сеть шифрование PHP XOR для нахождения некоторой реализации. Первый, который я нашел, здесь.
Я играл с этим видом вещи сам, моим дилетантским способом, и прибыл в своего рода идиотский алгоритм скремблирования числа, включив смешанные основания. В основном у меня есть функция, которая отображает число между 0-N к другому числу в диапазоне 0-N. Для URL я затем отображаю то число на несколько английских слов. (слова легче помнить).
Упрощенная версия того, что я делаю без смешанных оснований: у Вас есть число, которое составляет 32 бита, поэтому заранее, имейте ключ доступа, который 32 бита длиной, и XOR ключ доступа с Вашим входным числом. Затем переставьте биты вокруг в определенном переупорядочении. (возможно на основе Вашего ключа доступа).
Хорошая вещь об этом
если Вы подлежите смешанной версии основания, это - в основном то же, за исключением того, что я добавляю шаги преобразования входа к смешанному raddix числу, с помощью простых множителей максимального диапазона в качестве оснований цифры. Затем я переставляю цифры вокруг, сохраняя основания с цифрами, и возвращаю его в стандартное целое число.
Вы могли бы найти полезным пересмотреть идею использовать GUID, потому что можно создать GUID способом, который не подвергается коллизии.
Проверьте страницу Wikipedia на GUID - алгоритм "Типа 1" использует и MAC-адрес ПК и текущую дату / время как исходные данные. Это гарантирует, что коллизии просто невозможны.
С другой стороны, при создании столбца GUID в базе данных как альтернативный ключ (продолжайте использовать автоинкрементные первичные ключи), определите ее как уникальную. Затем если Ваш подход поколения GUID действительно даст дубликат, то Вы преуспеете, соответствующая ошибка вставляют это, можно обработать.
Вчера я видел этот вопрос: как reddit генерирует alphanum идентификатор
Я думаю, что это - довольно хороший метод (и particularily умный)
это использует Python
def to_base(q, alphabet):
if q < 0: raise ValueError, "must supply a positive integer"
l = len(alphabet)
converted = []
while q != 0:
q, r = divmod(q, l)
converted.insert(0, alphabet[r])
return "".join(converted) or '0'
def to36(q):
return to_base(q, '0123456789abcdefghijklmnopqrstuvwxyz')
Добавьте символ (10), поле к Вашей таблице порядка... называет его 'order_number'.
После того, как Вы создаете новый порядок, случайным образом генерируете целое число от 1... 9999999999. Проверьте, чтобы видеть, существует ли это в базе данных под 'order_number'. В противном случае обновите свою последнюю строку с этим значением. Если это действительно существует, выберите другое число наугад.
Используйте 'order_number' для публично видимых URL, возможно, всегда дополняемых нулями.
Существует беспокойство состояния состязания о том, когда два потока пытаются добавить то же число, одновременно... Вы могли сделать блокировку таблицы, если бы Вы были действительно заинтересованы, но это - большой молоток. Добавьте вторую проверку после обновления, повторного выбора, чтобы гарантировать, что это уникально. Звоните рекурсивно, пока Вы не получите уникальную запись. Живите для случайного числа миллисекунд между вызовами и используйте текущее время в качестве семени для генератора случайных чисел.
Сильно ударенный отсюда.
ОБНОВЛЕННЫЙ Как с использованием подхода GUID, описанного Bevan, если столбец ограничивается как уникальный, то Вы не должны потеть он. Я предполагаю, что это не отличается, что с помощью GUID, за исключением того, что у клиента и Обслуживания клиентов будет более легкое время, обращаясь к порядку.
Я честно вещь, шифрующая/дешифрующая данные строки запроса, являюсь плохим подходом к этой проблеме. Самое легкое решение отправляет, данные с помощью POST вместо ДОБИРАЮТСЯ. Если пользователи нажимают на ссылки с querystring данными, необходимо обратиться к некоторым взломам JavaScript для отправки, данные POST (помните о доступности для пользователей с выключенным JavaScript). Это не препятствует тому, чтобы пользователи просмотрели источник, но по крайней мере это сохраняет чувствительным от того, чтобы быть индексированным поисковыми системами, принимая данные, которые Вы пытаетесь скрыть действительно настолько чувствительный во-первых.
Другой подход должен использовать естественный уникальный ключ. Например, при издании счетов клиентам ежемесячно затем "yyyyMM[customerID]" однозначно определяет конкретный счет на конкретного пользователя.
Из Вашего описания, лично, я начался бы путем работы с любой стандартной библиотекой шифрования, доступно (я - программист Java, но я предполагаю, скажем, что основная библиотека Шифрования AES должна быть доступна для PHP):
Кроме того, если Вы хотите скрыть это, переменная является идентификатором счета, Вы могли бы считать вызов ее чем-то другим, чем "invoice_id".