如何将18个字符串转换为唯一ID?

Ro.*_*Ro. 6 java algorithm hash

我有一个18字符串,我需要转换为一个独特的长(在Java中).示例字符串将是:AAA2aNAAAAAAADnAAA

我的String实际上是一个Oracle ROWID,因此可以根据需要进行细分,请参阅:http: //download-uk.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#CNCPT713

生成的长数,(1)必须是唯一的,因为没有两个结果可以指向同一个数据库行和(2)必须是可逆的,所以我可以从长时间返回ROWID字符串?

有关使用算法的任何建议都将受到欢迎.

几年前的Oracle论坛问题:http://forums.oracle.com/forums/thread.jspa?messageID = 1059740

unw*_*ind 11

你不能满足这些要求.

(假设)大写和小写字母的18个字符具有56 18或大约2.93348915×103 31个组合.这是(方式)超过64位中可用的近似1.84467441×10 19组合.

更新:我的组合学错了,呵呵.但结果相同.


Dar*_*mas 5

只需创建一个将ROWID字符串映射到(递增)long的映射(字典/散列表).如果你保留两个这样的词典并将它们包装在一个很好的类中,你将在字符串和长ID之间进行双向查找.

伪代码:

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]
Run Code Online (Sandbox Code Playgroud)


Ro.*_*Ro. 0

找到了一种以不同方式从数据库中提取 ROWID 的方法......

SQL> 选择 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

然后将其转换为数字,如下所示:

最终 String hexNum = rowid.replaceAll( "\.", "" );
最终长lowerValue = Long.parseLong( hexNum.substring( 1 ), 16 );
long upperNibble = Integer.parseInt( hexNum.substring( 0, 1 ), 16 );
if ( 上半字节 >= 8 ) {
  //捕获 ROWID > 8F000000.0000.0000 的情况
  上半字节 -= 8;
  返回 -( 9223372036854775807L - ( lowerValue - 1 + ( upperNibble << 60 ) ) );
} 别的 {
  返回(lowerValue +(upperNibble << 60));
}

然后将该数字反转回字符串格式,如下所示:

String s = Long.toHexString( featureID );
//将 0 放在字符串的开头,形成大小为 16 的 Strnig
s = StringUtil.padString( s, 16, '0', true );
StringBuffer sb = new StringBuffer( s );
sb.insert( 8, '.' );
sb.insert( 13, '.' );

返回 sb.toString();

为所有的回应干杯。