...и, в частности, про Guid'ы. 3 полных рабочих дня серьезной работы над вечно ускользающей проблемой, и еще несколько мелких попыток ее решить до этого, были убиты на совершенную чушь.
В MS SQL есть временами удобный тип - GUID. В С# же, в системной библиотеке, по причине тех же удобств, есть структура Guid. Их сходство невероятно - формат, 128-битовость, свойства случайности генерируемых идентификаторов... Внимательный взгляд внутрь С# только подверждает: тип SqlGuid, возвращаемый из драйвера MS SQL, унаследован от System.Guid. Так что, можно брать "SELECT myguid FROM atable ORDER BY myguid ASC", и спокойно пользоваться резульататами, мастерски оперируя до-диезом? Нам ведь кажется совершенно нормальным, что myguidi.CompareTo(myguidi+1) будет всегда меньше нуля? Ибо MS SQL отсортировал их по возрастающей, таким образом в каждой предыдущей клеточке результата Гуид будет меньше последующей?.. Ага! Вот вы и попались.
Правильный ответ: иногда. Иногда будет, иногда не будет. Потому что Guid.CompareTo() сравнивает их как 128-битовые числа. А MS SQL считает последние 48(!) бит единственно(!) важными для сравнения... Не верите?
Зато пришлось, ломая глаза о дебри Гуидной кракозябры, сидеть с распечатками, и, чуствуя себя Франкенштейном Кобола 50-х, выискивать неправильно пробитую краточку. А потом, путем сложных логических вычислений, из дебрей же трансформацинного алгоритма с несколькими уровнями сложности, понять ЧТО же там не работает, и КАК оно на самом деле работает. Потом проверить документацию, и прочитать ее, но совсем не в том месте, в котором я даже теоретически мог бы ее найти. Ибо расписаны эти отличия в SqlGuid.CompareTo подсказке, а все алгоритмы работают на уровень выше, независимо от драйверов конкретных баз данных, и пользуются универсальным Guid'ом. Помощь для которого я внимательно прочтитал много раз... Ыыых.
Но проблема теперь даже не в этом. Достаточно ли уникальны последние 48 бит, чтобы полагаться на однозначность сортировок больших наборов данных в будущем? Ибо ж, блин, оно и QA скорее всего пройдет, а вот когда у клиента будет очерендная пара миллионов записей, вот тут и ё... упадет моя программка. Мда. И че теперь? Сосать всё в память, ибо MS SQL сортировке не обучен? В непонятках я... Спасибо за внимание, крик души просто.
В MS SQL есть временами удобный тип - GUID. В С# же, в системной библиотеке, по причине тех же удобств, есть структура Guid. Их сходство невероятно - формат, 128-битовость, свойства случайности генерируемых идентификаторов... Внимательный взгляд внутрь С# только подверждает: тип SqlGuid, возвращаемый из драйвера MS SQL, унаследован от System.Guid. Так что, можно брать "SELECT myguid FROM atable ORDER BY myguid ASC", и спокойно пользоваться резульататами, мастерски оперируя до-диезом? Нам ведь кажется совершенно нормальным, что myguidi.CompareTo(myguidi+1) будет всегда меньше нуля? Ибо MS SQL отсортировал их по возрастающей, таким образом в каждой предыдущей клеточке результата Гуид будет меньше последующей?.. Ага! Вот вы и попались.
Правильный ответ: иногда. Иногда будет, иногда не будет. Потому что Guid.CompareTo() сравнивает их как 128-битовые числа. А MS SQL считает последние 48(!) бит единственно(!) важными для сравнения... Не верите?
Зато пришлось, ломая глаза о дебри Гуидной кракозябры, сидеть с распечатками, и, чуствуя себя Франкенштейном Кобола 50-х, выискивать неправильно пробитую краточку. А потом, путем сложных логических вычислений, из дебрей же трансформацинного алгоритма с несколькими уровнями сложности, понять ЧТО же там не работает, и КАК оно на самом деле работает. Потом проверить документацию, и прочитать ее, но совсем не в том месте, в котором я даже теоретически мог бы ее найти. Ибо расписаны эти отличия в SqlGuid.CompareTo подсказке, а все алгоритмы работают на уровень выше, независимо от драйверов конкретных баз данных, и пользуются универсальным Guid'ом. Помощь для которого я внимательно прочтитал много раз... Ыыых.
Но проблема теперь даже не в этом. Достаточно ли уникальны последние 48 бит, чтобы полагаться на однозначность сортировок больших наборов данных в будущем? Ибо ж, блин, оно и QA скорее всего пройдет, а вот когда у клиента будет очерендная пара миллионов записей, вот тут и ё... упадет моя программка. Мда. И че теперь? Сосать всё в память, ибо MS SQL сортировке не обучен? В непонятках я... Спасибо за внимание, крик души просто.