Мне нужно запутать текстовое содержимое элемента. Скажем, например, идентификатор плана. Идентификатор плана может появляться несколько раз в одном документе или в разных документах. Мне нужно, чтобы запутанный идентификатор плана был уникальным и последовательным (всегда сопоставлял 12345 с abc72) и ограничивался только 5 символами. Я бы предпочел не иметь отдельного существующего документа, который использовался бы в качестве файла сопоставления или содержал бы ключи.
Простая хеш-функция не будет работать из-за ограничения длины символа. Любые другие идеи? Я хотел бы продолжать делать это в чистом XQuery.
Ответ 1 · рейтинг 2 · Eric Bloch
Вы можете использовать fn:translate (похоже на команду unix tr), чтобы надежно преобразовать один символ в другой. Это похоже на старый добрый rot13, но более гибкий и мощный.
Вы также можете использовать это, используя разные фиксированные переводы для каждой позиции в ваших текстовых строках.
Ответ 2 · рейтинг 1 · mblakele
Вы все еще можете использовать хеширование. Просто обрежьте до нужного количества цифр, например:
substring(
xdmp:integer-to-hex(xdmp:hash64($input)),
1, string-length($input))
Пока функция хеширования хороша, это должно работать нормально. Если вам нужно обрабатывать длинные строки, дополните хеш несколько раз, а затем усеките. Если вам нужна какая-либо безопасность, вы должны добавить закрытый ключ и заменить xdmp:hash64 на xdmp:hmac-sha512. В любом случае это может быть хорошей идеей, поскольку SHA-2 512 имеет хорошо известные характеристики.
substring(
xdmp:hmac-sha512($key, $input, 'base64'),
1, string-length($input))
Коллизии хешей возможны, но маловероятны.