.h файлы должны использоваться для определения прототипов для функций. Это необходимо, таким образом, можно включать прототипы, в которых Вы нуждаетесь в своем C-файле, не объявляя каждую функцию, что Вам нужны все в одном файле.
, Например, когда Вы #include <stdio.h>
, это обеспечивает прототипы для printf и других функций IO. Символы для этих функций обычно загружаются компилятором по умолчанию. Можно посмотреть на.h файлы системы под/usr/include, если Вы интересуетесь нормальными идиомами, связанными с этими файлами.
, Если Вы только пишете тривиальные приложения с не много функций, не действительно необходимо построить все из модулей в логические группировки процедур. Однако, если у Вас будет потребность разработать большую систему, тогда необходимо будет уделить некоторое внимание как, туда, где определить каждую из функций.
Нашел способ извлекать 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();
Приветствую всех.
Вы не можете с этими требованиями.
18 символов (при условии) прописных и строчных букв имеют 56 18 или около 2,93348915 × 103 31 комбинаций. Это (намного) больше, чем приблизительно 1,84467441 × 10 19 комбинаций, доступных среди 64 битов.
ОБНОВЛЕНИЕ: Я ошибся в комбинаторике, хех. Хотя результат тот же.
Просто создайте карту (словарь / хэш-таблицу), которая отображает строки 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]
Я предполагаю, что это буквенно-цифровая строка без учета регистра, и поэтому она взята из набора [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 байтов, вы можете довольно просто определить отображение:
Очевидно, что Java не имеет ничего, кроме 8 байтов длиной
. Поэтому, если вам нужно использовать long
, то НЕ возможно однозначно сопоставить строки, если нет чего-то еще, что уменьшает пространство допустимых входных строк.
Ваша строка из 18 символов, представляющая базу 64 кодирование представляет в общей сложности 108 бит информации, что почти вдвое больше, чем у long 64. У нас есть небольшая проблема, если мы хотим представить все возможные ключи и сделать это представление обратимым.
Строка может быть разорвана. на 4 числа достаточно легко. Каждое из этих 4 чисел представляет что-то - номер блока, смещение в этом блоке, что угодно. Если вам удастся установить верхние пределы для базовых величин, так что вы знаете, что больших чисел не произойдет (т. Е. Если вы найдете способ идентифицировать по крайней мере 44 из этих битов, которые всегда будут равны 0), то вы можете отобразить остальные на long, обратимо.
Другой возможностью было бы ослабить требование, чтобы эквивалент был длиной long
. Как насчет BigInteger
? Это упростило бы задачу.
Теоретически вы не можете представить 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, если они близки к пределу.
Звучит ... неприглядно, но я не знаю вашего контекста, поэтому стараюсь не выносить суждения. 8)
Рассматривали ли вы преобразование символов в строке в их эквиваленты ASCII?
ДОПОЛНЕНИЕ: Конечно, требовалось обрезать полусверхпрочные символы, чтобы они поместились, что похоже на вариант, который вы можете получить из комментариев.