Исходя из комментариев выше, я бы посоветовал вам просто использовать N-грамм в качестве собственного идентификатора. Таким образом, нет необходимости поддерживать отдельное сопоставление идентификаторов с N-граммами.
Например, скажем, у вас есть документ, содержащий текст "привет", который содержит триграммы "hel", "ell" и "llo" (при условии, что вы не включаете границы слов). Вместо того, чтобы сначала настроить отображение идентификатора, например 1 = "hel", 2 = "ell", 3 = "llo" и иметь подпись документа, равную множеству {1, 2, 3}, вы можете использовать N-граммы напрямую как подпись документа {"hel", "ell", "llo"}. Таким образом, вы можете даже объединить фазы сканирования и обработки в один проход документа.