Как преобразовать 18 Символьных строк в Уникальный идентификатор?

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

, Например, когда Вы #include <stdio.h>, это обеспечивает прототипы для printf и других функций IO. Символы для этих функций обычно загружаются компилятором по умолчанию. Можно посмотреть на.h файлы системы под/usr/include, если Вы интересуетесь нормальными идиомами, связанными с этими файлами.

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

6
задан Ro. 25 November 2009 в 16:05
поделиться

7 ответов

Нашел способ извлекать ROWID из базы данных другим способом ....

SQL> select DBMS_ ROWID.ROWID_ TO_RESTRICTED( ROWID, 1 ) FROM MYTABLE;

0000EDF4.0001.0000 0000EDF4.0002.0000 0000EDF4.0004.0000 0000EDF4.0005.0000 0000EDF4.0007.0000 0000EDF5.0000.0000 0000EDF5.0002.0000 0000EDF5.0003.0000

Затем преобразовать его в число, например:

final String hexNum = rowid.replaceAll( "\.", "" );
final long lowerValue = Long.parseLong( hexNum.substring( 1 ), 16 );
long upperNibble = Integer.parseInt( hexNum.substring( 0, 1 ), 16 );
if ( upperNibble >= 8 ) {
  //Catch Case where ROWID > 8F000000.0000.0000
  upperNibble -= 8;
  return -( 9223372036854775807L - ( lowerValue - 1 + ( upperNibble << 60 ) ) );
} else {
  return ( lowerValue + ( upperNibble << 60 ) );
}

Затем верните это число обратно в строковый формат, например:

String s = Long.toHexString( featureID );
//Place 0's at the start of the String making a Strnig of size 16
s = StringUtil.padString( s, 16, '0', true ); 
StringBuffer sb = new StringBuffer( s );
sb.insert( 8, '.' );
sb.insert( 13, '.' );

return sb.toString();

Приветствую всех.

0
ответ дан 8 December 2019 в 05:55
поделиться

Вы не можете с этими требованиями.

18 символов (при условии) прописных и строчных букв имеют 56 18 или около 2,93348915 × 103 31 комбинаций. Это (намного) больше, чем приблизительно 1,84467441 × 10 19 комбинаций, доступных среди 64 битов.

ОБНОВЛЕНИЕ: Я ошибся в комбинаторике, хех. Хотя результат тот же.

11
ответ дан 8 December 2019 в 05:55
поделиться

Просто создайте карту (словарь / хэш-таблицу), которая отображает строки ROWID на (увеличиваемую) длину. Если вы сохраните два таких словаря и заключите их в красивый класс, у вас будет двунаправленный поиск между строками и длинными идентификаторами.

Псевдокод:

class BidirectionalLookup:
    dict<string, long> stringToLong
    dict<long, string> longToString
    long lastId

    addString(string): long
        newId = atomic(++lastId)
        stringToLong[string] = newId
        longToString[newId] = string
        return newId

    lookUp(string): long
        return stringToLong[string]

    lookUp(long): string
        return longToString[long]
5
ответ дан 8 December 2019 в 05:55
поделиться

Я предполагаю, что это буквенно-цифровая строка без учета регистра, и поэтому она взята из набора [a-zA-Z0-9] *

В этом случае вы иметь

26 + 26 + 10 = 62 

возможных значений для каждого символа.

62 < 64 = 2^6

Другими словами, вам нужно (как минимум) 6 бит для хранения каждого из 18 символов ключа.

6 * 18 = 108 bits 

для уникального хранения всей строки.

108 bits  = (108 / 8) = 13.5 bytes.

Поэтому, пока ваш тип данных может хранить не менее 13,5 байтов, вы можете довольно просто определить отображение:

  1. Сопоставить необработанный ASCII для каждого символа с представлением, используя только 6 бит
  2. Объедините все 18 сокращенных представлений в одно 14-байтовое значение
  3. Преобразуйте это в ваше окончательное значение данных

Очевидно, что Java не имеет ничего, кроме 8 байтов длиной . Поэтому, если вам нужно использовать long , то НЕ возможно однозначно сопоставить строки, если нет чего-то еще, что уменьшает пространство допустимых входных строк.

2
ответ дан 8 December 2019 в 05:55
поделиться

Ваша строка из 18 символов, представляющая базу 64 кодирование представляет в общей сложности 108 бит информации, что почти вдвое больше, чем у long 64. У нас есть небольшая проблема, если мы хотим представить все возможные ключи и сделать это представление обратимым.

Строка может быть разорвана. на 4 числа достаточно легко. Каждое из этих 4 чисел представляет что-то - номер блока, смещение в этом блоке, что угодно. Если вам удастся установить верхние пределы для базовых величин, так что вы знаете, что больших чисел не произойдет (т. Е. Если вы найдете способ идентифицировать по крайней мере 44 из этих битов, которые всегда будут равны 0), то вы можете отобразить остальные на long, обратимо.

Другой возможностью было бы ослабить требование, чтобы эквивалент был длиной long . Как насчет BigInteger ? Это упростило бы задачу.

4
ответ дан 8 December 2019 в 05:55
поделиться

Теоретически вы не можете представить ROWID длинным (8 байтов). Однако, в зависимости от размера ваших баз данных (всего сервера, а не только вашей таблицы), вы можете закодировать его в long.

Вот схема ROWID,

   OOOOOO-FFF-BBBBBB-RRR

где O - ObjectID. F - это FileNo. B - блок, R - номер строки. Все они в кодировке Base64. Как видите, O&B может иметь 36 битов, а B&R - 18.

Если ваша база данных невелика, вы можете использовать 2 байта для каждой части. Обычно ваш ObjectId и номер блока будут ограничены 64 КБ. Наш администратор баз данных считает, что наша база данных должна быть в несколько раз больше, чтобы мы могли приблизиться к этим пределам.

Я бы посоветовал вам найти максимум каждой части в вашей базе данных и посмотреть, близки ли вы. Я бы не стал использовать long, если они близки к пределу.

1
ответ дан 8 December 2019 в 05:55
поделиться

Звучит ... неприглядно, но я не знаю вашего контекста, поэтому стараюсь не выносить суждения. 8)

Рассматривали ли вы преобразование символов в строке в их эквиваленты ASCII?

ДОПОЛНЕНИЕ: Конечно, требовалось обрезать полусверхпрочные символы, чтобы они поместились, что похоже на вариант, который вы можете получить из комментариев.

-1
ответ дан 8 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: