好吧,我有一些数据需要动态分配一个int类型标识符。
例如,这是一个示例记录。
<Listing>
<sportcode>AA</sportcode>
<lgabbr>NL</lgabbr>
<division>CENTRAL</division>
...
<Listing>
此列表中有更多数据,但这些是我可用于生成标识符的唯一字段,我必须使用所有这些字段。
如何将这些组合在一起以创建独特的标识符?
到目前为止我唯一的想法是将字符串连接在一起然后用它的charcode替换每个字符。当我只对运动代码(AA = 6565)或运动代码和lgabbr(AANL = 65657876)进行编码时,这种方法很好,但是当我添加分区时,ID会变得很长而且很笨拙(AANLCENTRAL = 6565787667697884826576)。
关于如何在保持完全独特的同时使其更加简洁的任何建议?
修改
已经提交了几个答案,说明如何扭转这一过程。我想我应该提一下这个过程根本不需要是可逆的。生成数字后,即应用程序其余部分使用的值。
再次修改 虽然我得到了一些很好的建议,但我决定采用与我的解决方案不同的方式。由于分配标识符的最有效方法是自己选择它们而不是生成它们,我添加了一个带有id defenitions的XML文档,它们是相应的数据。现在我用来创建标识符的XSLT样式表可以在附页中查找并使用我指定的标识符。我不想自定义所有内容,因为有太多的可能性。大约有25个运动代码,10/15 lgabbr和10个分区。在样式表中要考虑到这一点。添加额外的XML文档将这些数据合并到样式表之外以便于编辑,这就是我要采用的方法(并且它可以使用BTW)。
感谢你的所有建议。
答案 0 :(得分:2)
如果限制字符串中的字符(例如只有UPPER-CASE Latin),则可以使用它们调整为基数为26的数字。如:
TEST 字将调整为 J4IJ ,并以十进制 337135 调整。
Base-26使用数字(0-9,A-P)
使用此模式,您可以连接字符串并生成数字。
答案 1 :(得分:2)
这取决于每个值所需的大小。只有几个部门吗?一些运动代码?想想增长,并确保为此留出空间。
一种选择是为每个值生成唯一值,然后将它们组合在一起。您将每个值编号为INT,以便Sportcode“AA”= 1,“AB”= 2(假设这是您的格式),为您的分区编号,依此类推。然后,确定表达每个值所需的二进制位数:
一旦你知道每个位需要多少位,就可以将它们移位并将它们组合成一个数字。例如,如果上面的第一行以SportCode = 1,Lgabbr = 5和Division = 3结束,并且为了简单起见,您决定每列只需要4位(每个列可能有16个值),然后:
Key = Sportcode + (Lgabbr << 4) + (Division << 8)
这将给你1 + 80 + 768 = 849,它唯一地标识该组合。要获得该值,您将使用以下约定:
SportCode = Key MOD 16
Lgabbr = (Key >> 4) MOD 16
Division = (Key >> 8)
答案 2 :(得分:0)
将SportCode用作从0开始的整数(就像枚举一样) 使用lgabbr作为从0开始的整数等。 所以...
NOSPORT == 0;
AA == 1;
NOLGABBR == 0;
NL == 1;
NODIV == 0;
CENTRAL == 0;
那么猫然后在一起....例如,000将是没有运动,没有lgabber,没有分裂