Объедините два целых числа, чтобы создать уникальный номер - PullRequest
14 голосов
/ 22 ноября 2010

Доброе утро,

Я искал способ объединить два целых числа для создания уникального числа, у меня есть две таблицы, которые мне нужно объединить в третью таблицу с уникальными числами,

Это мои таблицы:

Table A 
SchoolID    ClassId
107 56644231
107 56644532
107 320110212

Table B 
SchoolID    ClassId
108 566442310
108 56644532
108 50110212

Мне нужно экспортировать эти поля в третью таблицу, объединяющую идентификатор класса и идентификатор школы в одно поле с именем classID. Мне нужно объединить эти числа вместе, а затем объединить их, чтобы получить Schoolid и Classid отдельно для целей обновления. Я думал о соединении строк 'schoolid + '00' + 'classid', так как я знаю, что schoolid всегда будет трехзначным числом, но я ищу какой-то другой способ, возможно математический, где мне не нужно использовать приведение строк.

Есть ли математический способ сделать это? Или это лучший способ сделать это?

Я использую C # для кодирования решения.

Спасибо

Ответы [ 7 ]

16 голосов
/ 22 ноября 2010

Аналогично Магнусу Хоффу, но я бы рекомендовал использовать бинарный дружественный подход вместо базового 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;
7 голосов
/ 22 ноября 2010
combinedid = classid*1000 + schoolid

А потом, позже:

classid = combinedid / 1000 // Integer division
schoolid = combinedid % 1000
5 голосов
/ 22 ноября 2010

Я бы скомбинировал ID так:

ID = ClassID * 1000 + SchoolID

Затем вы можете получить SchoolID вот так:

SchoolID = ID % 1000

и вы можете получить ClassID вот так:

ClassID = ID / 1000
2 голосов
/ 01 февраля 2013

Использование ((a + b) (a + b + 1) * 0.5) + b Ссылка http://en.wikipedia.org/wiki/Pairing_function

2 голосов
/ 14 декабря 2012

Этот поток SO подробно описывает различные другие математические подходы, некоторые из них просто лучше. Но для вашего случая я подозреваю, что это вряд ли хорошие идеи. Я бы сказал, что вы должны сохранить два идентификатора в третьей таблице, которая имеет собственный столбец уникального идентификатора (первичный ключ).

2 голосов
/ 22 ноября 2010

Если SchoolID всегда представляет собой трехзначное число, умножьте ClassId на 1000, затем добавьте SchoolID.

Хотя ваш номер может «переполниться», и с учетом тех, которые у вас есть, если они 32-разрядные, они будут.

2 голосов
/ 22 ноября 2010

Вы указываете, что работаете с таблицей.Это заставляет меня поверить, что вы работаете в базе данных.

Итак, я должен спросить, почему бы не сохранить их в отдельных столбцах и сделать их простыми внешними ключами?Зачем создавать неоднозначность попыток соединить или преобразовать числа с помощью математического уравнения?

Если вы используете другую таблицу, вы можете использовать поле автоинкремента, и комбинация трех полей (в указанном вами порядке) даст вам уникальный идентификатор.

|-------------------
| My_combine_table
|-------------------
| id   | auto_inc 
|-------------------
| SchoolID | ...
| SchoolID2 | ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...