Объедините два целых числа, чтобы создать уникальный номер
Доброе утро,
Я искал способ объединить два целых числа для создания уникального числа, у меня есть две таблицы, которые мне нужно объединить в третью таблицу с уникальными номерами,
Это мои таблицы:
Table A
SchoolID ClassId
107 56644231
107 56644532
107 320110212
Table B
SchoolID ClassId
108 566442310
108 56644532
108 50110212
Мне нужно экспортировать эти поля в третью таблицу, комбинируя идентификатор класса и идентификатор школы в одно поле с именем classID. Мне нужно объединить эти числа вместе, а затем уметь их унифицировать, чтобы разделить школьные и групповые для целей обновления. Я думал об объединении строк 'schoolid + '00' + 'classid'
, так как я знаю, что школьник всегда будет 3-значным числом, но я ищу какой-то другой способ, возможно, математический, где мне не нужно использовать строковые трансляции.
Есть ли математический способ сделать это? Или литье для наилучшего способа сделать это?
Я использую С# для кодирования решения.
Спасибо,
Ответы
Ответ 1
Подобно Магнусу Хоффу, но я бы рекомендовал использовать подход, основанный на двоичном подходе, вместо подхода base 10.
combinedid = (classid << 8) + schoolid;
И затем, позже:
classid = combinedid >> 8;
schoolid = combinedid & 0xFF;
Я думаю, что это немного более прямолинейно с точки зрения программирования (ясно, что ваш идентификатор школы равен 1 байт (0-255), идентификатор класса - 3 байта).
Вы также можете легко сделать это с помощью bigint (Long/Int64), сделав два int32 одним int64 безопасным:
combinedid = ((long)classid << 32) + schoolid;
Ответ 2
combinedid = classid*1000 + schoolid
И затем, позже:
classid = combinedid / 1000 // Integer division
schoolid = combinedid % 1000
Ответ 3
Я бы скомбинировал ID следующим образом:
ID = ClassID * 1000 + SchoolID
Затем вы можете получить SchoolID
следующим образом:
SchoolID = ID % 1000
и вы можете получить ClassID
следующим образом:
ClassID = ID / 1000
Ответ 4
Вы указываете, что работаете со столом. Это заставляет меня думать, что вы работаете в базе данных.
Итак, я должен спросить, почему бы не хранить их в отдельных столбцах и сделать их простыми внешними ключами? Зачем создавать неоднозначность попыток конкатенации или преобразования чисел с помощью математического уравнения?
Если вы используете другую таблицу, вы можете использовать поле автоматического приращения, и комбинация трех полей (в указанном вами порядке) даст вам уникальный идентификатор.
|-------------------
| My_combine_table
|-------------------
| id | auto_inc
|-------------------
| SchoolID | ...
| SchoolID2 | ...
Ответ 5
Если SchoolID всегда является 3-значным числом, умножающим ClassId на 1000, тогда добавьте SchoolID.
Ваш номер может "переполняться", хотя., и учитывая те, которые у вас есть, если они 32-разрядные, они будут.
Ответ 6
Этот поток SO содержит подробные различные математические подходы, некоторые из них только лучше. Но для вашего дела я подозреваю, что это вряд ли хорошие идеи. Я бы сказал, что вы должны сохранить две идентификаторы в третьей таблице, которая имеет свой собственный уникальный идентификатор (первичный ключ).
Ответ 7
Использовать ((a + b) (a + b + 1) * 0.5) + b
Справка
http://en.wikipedia.org/wiki/Pairing_function