1-1 отображение для идентификационной путаницы

Я хочу извлечь из третьего символа в векторе выше (в частности, извлечь число)

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+")
11
задан Cœur 21 October 2018 в 06:18
поделиться

7 ответов

Я нахожу, что простое шифрование XOR подходит лучше всего для путаницы URL. Можно продолжить использовать безотносительно порядкового номера Вы используете без изменения. Далее шифрование XOR не увеличивает длину исходной строки. Если Ваш текст составит 22 байта, то зашифрованная строка составит 22 байта также. Это не достаточно легко, чтобы быть предположенным как гниль 13, но не тяжелый вес как DSE/RSA.

Ищите сеть шифрование PHP XOR для нахождения некоторой реализации. Первый, который я нашел, здесь.

7
ответ дан 3 December 2019 в 07:39
поделиться

Я играл с этим видом вещи сам, моим дилетантским способом, и прибыл в своего рода идиотский алгоритм скремблирования числа, включив смешанные основания. В основном у меня есть функция, которая отображает число между 0-N к другому числу в диапазоне 0-N. Для URL я затем отображаю то число на несколько английских слов. (слова легче помнить).

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

Хорошая вещь об этом

  1. Никакие коллизии, пока Вы переставляете и xor тем же путем каждый раз
  2. Никакая потребность сохранить запутываемые ключи в базе данных
  3. Все еще используйте свой заказанный IDS внутренне, так как можно инвертировать путаницу
  4. Можно повторить операцию несколько раз для получения более запутываемых результатов.

если Вы подлежите смешанной версии основания, это - в основном то же, за исключением того, что я добавляю шаги преобразования входа к смешанному raddix числу, с помощью простых множителей максимального диапазона в качестве оснований цифры. Затем я переставляю цифры вокруг, сохраняя основания с цифрами, и возвращаю его в стандартное целое число.

3
ответ дан 3 December 2019 в 07:39
поделиться

Вы могли бы найти полезным пересмотреть идею использовать GUID, потому что можно создать GUID способом, который не подвергается коллизии.

Проверьте страницу Wikipedia на GUID - алгоритм "Типа 1" использует и MAC-адрес ПК и текущую дату / время как исходные данные. Это гарантирует, что коллизии просто невозможны.

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

2
ответ дан 3 December 2019 в 07:39
поделиться

Вчера я видел этот вопрос: как 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')
2
ответ дан 3 December 2019 в 07:39
поделиться

Добавьте символ (10), поле к Вашей таблице порядка... называет его 'order_number'.

После того, как Вы создаете новый порядок, случайным образом генерируете целое число от 1... 9999999999. Проверьте, чтобы видеть, существует ли это в базе данных под 'order_number'. В противном случае обновите свою последнюю строку с этим значением. Если это действительно существует, выберите другое число наугад.

Используйте 'order_number' для публично видимых URL, возможно, всегда дополняемых нулями.

Существует беспокойство состояния состязания о том, когда два потока пытаются добавить то же число, одновременно... Вы могли сделать блокировку таблицы, если бы Вы были действительно заинтересованы, но это - большой молоток. Добавьте вторую проверку после обновления, повторного выбора, чтобы гарантировать, что это уникально. Звоните рекурсивно, пока Вы не получите уникальную запись. Живите для случайного числа миллисекунд между вызовами и используйте текущее время в качестве семени для генератора случайных чисел.

Сильно ударенный отсюда.

ОБНОВЛЕННЫЙ Как с использованием подхода GUID, описанного Bevan, если столбец ограничивается как уникальный, то Вы не должны потеть он. Я предполагаю, что это не отличается, что с помощью GUID, за исключением того, что у клиента и Обслуживания клиентов будет более легкое время, обращаясь к порядку.

1
ответ дан 3 December 2019 в 07:39
поделиться

Я честно вещь, шифрующая/дешифрующая данные строки запроса, являюсь плохим подходом к этой проблеме. Самое легкое решение отправляет, данные с помощью POST вместо ДОБИРАЮТСЯ. Если пользователи нажимают на ссылки с querystring данными, необходимо обратиться к некоторым взломам JavaScript для отправки, данные POST (помните о доступности для пользователей с выключенным JavaScript). Это не препятствует тому, чтобы пользователи просмотрели источник, но по крайней мере это сохраняет чувствительным от того, чтобы быть индексированным поисковыми системами, принимая данные, которые Вы пытаетесь скрыть действительно настолько чувствительный во-первых.

Другой подход должен использовать естественный уникальный ключ. Например, при издании счетов клиентам ежемесячно затем "yyyyMM[customerID]" однозначно определяет конкретный счет на конкретного пользователя.

0
ответ дан 3 December 2019 в 07:39
поделиться

Из Вашего описания, лично, я начался бы путем работы с любой стандартной библиотекой шифрования, доступно (я - программист Java, но я предполагаю, скажем, что основная библиотека Шифрования AES должна быть доступна для PHP):

  • на базе данных просто ключевые вещи, поскольку Вы обычно были бы
  • каждый раз, когда необходимо передать ключ к клиенту, используйте довольно сильную, стандартную систему шифрования (например, AES) для преобразования ключа к строке мусора. Как Ваш простой текст, используйте (сказать) 128-байтовый буферный содержащий: (сказать) 4-байтовый ключ, 60 случайных байтов и затем 64-байтовый хеш среднего качества предыдущих 64 байтов (см. Числовые Рецепты для примера) - очевидно, при получении такой строки Вы дешифруете ее, затем проверяют, соответствует ли хеш прежде, чем поразить DB. Если Вы более параноики, отправьте зашифрованный AES буфер случайных байтов с Вашим ключом в произвольном положении плюс безопасный хеш того буфера как отдельный параметр. Первая опция является, вероятно, разумным компромиссом между производительностью и безопасностью в Ваших целях, тем не менее, особенно в сочетании с другими мерами безопасности.
  • день, что Вы обрабатываете столько счетов в секунду, что AES, шифрующая их в пути, является также дорогой производительностью, выйдите и купите себя большой сервер с большим количеством центральных процессоров для празднования.

Кроме того, если Вы хотите скрыть это, переменная является идентификатором счета, Вы могли бы считать вызов ее чем-то другим, чем "invoice_id".

0
ответ дан 3 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

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