2015-01-14 2 views
1

У меня есть набор строк, которые мне нужно преобразовать в уникальные короткие идентификаторы.Создайте уникальные человекочитаемые идентификаторы (hash?) Для строк в R

Идентификаторы должны быть:

  • уникальным; это должно быть очень маловероятно, что разные строки приводят к одинаковым идентификаторам
  • automatic; Я не хочу создавать/hardcode ручные идентификаторы (как в: Id212).
  • как можно короче; эти идентификаторы должны быть как можно короче, потому что они должны вводиться людьми.
  • они не должны быть шестигранными, все буквы и цифры будут работать
  • должны быть легко обработаны людьми, но не быть читаемым человеком (они должны не делать какие-либо смысл).
  • криптографической защиты, помимо уникальности, не является проблемой

Я думал об этом:

string <- c("this is obviously an amateur") 
library(digest) 
hash <- digest(object = string, algo = "crc32", serialize = FALSE) 

в результате "ac32ed9d".

Мои вопросы:

  • я могу сделать эту строку еще короче, используя весь алфавит?
  • , похоже, вызывает озабоченность по поводу crc32, вызывающего столкновения - будет ли это проблемой, скажем, 500 довольно длинных предложений?
  • Это, как правило, хороший способ решить проблему?
+0

Достаточно ли сокращения? – hrbrmstr

+0

спасибо за указатель @hrbrmstr! 'abbreviate' не поможет, потому что его аббревиатуры _make sense_ (они не должны, это может отвлекать участников). Кроме того, строки иногда будут меняться тонкими, но релевантными способами, и я боюсь, что 'abbreviate' может привести к тем же аббревиатурам. – maxheld

ответ

3

Я не знаком с R, но постараюсь дать ответ на общую проблему.

В общем случае хэш-код генерирует число из заданной строки или объекта (o) в пределах заданного диапазона [0..R].

N = hash(o,R)

Вы можете использовать этот номер, чтобы произвести короткую строку следующим образом:

  1. Выберите диапазон символов (alphabeth), чтобы выбрать, например, [A-Z,a-z,0-9]. Обозначим его размер L (например, L = 62)
  2. Вычислить базового L представление N. Мы получаем серию цифр a_1,...,a_k где каждый a_i представляет собой число в [0 .. L-1]
  3. Карта каждая цифра его представляющего характера: 0 -> A, 1 -> B, ..., 62 -> 9

Вы можете обрезать полученную последовательность цифр по длине K по вашему выбору.

Существует фундаментальный компромисс между количеством доступных последовательностей и вероятностью столкновения.Когда вы используете хорошую хеш-функцию, вы можете считать число N равномерно распределенным в пределах диапазона. Когда вы выбрали алфавит из L символов и длину последовательности K, вероятность столкновения равна (1/L)^K.

+0

спасибо за объяснение, @Heinrich Hartmann! Я закончил с 8-значным хэшем из вышеперечисленного - в R есть одни и те же функции, чтобы изменить базу номера (я бы пошел на базу-36), но все они выглядят ошибками, потому что число слишком большой, если я не разделяю его сначала. На данный момент мы сделаем 8 цифр. Я рассмотрю вероятность столкновения позже, чтобы увидеть, могу ли я просто усечь шестнадцатеричный хеш. На данный момент у меня нет _lot_ элементов (200), но для других исследователей здесь может быть неплохое столкновение. – maxheld

Смежные вопросы