openlang

Разумно ли по умолчанию искать имена по ключу NFC?

Так, вставляю имя, а в конце у него e и следом U+0301. Через неделю ввожу то же имя руками, и клавиатура даёт U+00E9. Для меня это одно имя. Канонически эквивалентное, кстати. И всё же строки разные.

План для формы такой. Показывать то написание, которое отправили, а для поиска выводить ключ NFC. Я вижу на экране своё написание, а поиску уже неважно, какой из двух вариантов я ввёл. Цена в том, что представлений два и нужно ясно понимать, какое из них читает каждая операция. (И нет, аннотация string в TypeScript не скажет, вызывался ли normalize("NFC"). Это просто тип.)

А вот в чём я не уверен. Могут ли совпавшие имена принадлежать разным аккаунтам, NFC не решает. Это решение продукта. Совместимая нормализация и приведение регистра тоже самостоятельный выбор, и ничто из этого не защищает от имён, которые просто похожи на вид.

Годится ли это как поведение по умолчанию для поиска по отображаемому имени, если идентичность определяется где-то ещё? Хочу, чтобы экран сохранял написание человека, а производный ключ не решал втихую, кто этот человек.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    С разделением соглашусь. Поиск должен принимать только нормализованный ключ, а отправленный текст идёт рядом с ним.

    Но что здесь означает отсутствие значения? Если форма позволяет не указывать имя, null должен значить, что имя не ввели. Совмещать с этим смысл «нормализация ещё не выполнена» не стоит. Разницу видно на двух вызывающих. Экрану сохранённого имени нужно написание в том виде, в каком его отправили. Поисковому вызову нужен производный ключ. Если у двух аккаунтов может оказаться один ключ, поиск возвращает несколько совпадений или просит другой идентификатор. String в Kotlin без вопросительного знака обещает только, что значение есть. Ни про NFC, ни про то, чьё это имя, он ничего не говорит.

  2. Ссылка на ответ

    Вводим имя. Отправляем. normalize("NFC") срабатывает тут же, и обе версии уходят вместе. Значит, сохранённое имя никогда не зависает в состоянии «ещё не нормализовано», и null у hollis сохраняет ровно один смысл.

    Если поиск асинхронный, список совпадений, который он когда-нибудь вернёт, остаётся самостоятельным результатом. Нового смысла у имени от него не появляется. А как только в списке может оказаться больше одного аккаунта, поисковый вызов перестаёт быть проверкой владения и превращается в выбор. Вот тогда идентификатор аккаунта и начинает себя окупать.

  3. Ссылка на ответ

    В Swift "e\u{301}" == "\u{E9}" даёт true, и мне это кажется забавным. Равенство String основано на канонической эквивалентности, и хеширование ему следует, так что [String: Account] уже считает два ваших написания одним ключом. Звучит так, будто проблема решена, и отчасти так и есть.

    Но сохранённая строка всё равно та, что пришла, и как только ключ уходит в базу данных или в другой язык, сравнение снова идёт по кодовым единицам. Так что ключ NFC всё равно стоит выводить явно и хранить рядом с оригиналом.

Другие стороны того же вопроса

  1. Ключи поиска NFC и подписи JCS

    Подпись усложняет вопрос, который раньше задал kim_dh, где отправленное имя отделено от ключа поиска NFC. В JSON-нагрузке ест…

    Ответы 1typescript