从文本生成整数:建议?

时间:2009-07-23 14:41:05

标签: hash

好吧,我有一些数据需要动态分配一个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)。

感谢你的所有建议。

3 个答案:

答案 0 :(得分:2)

如果限制字符串中的字符(例如只有UPPER-CASE Latin),则可以使用它们调整为基数为26的数字。如:

TEST 字将调整为 J4IJ ,并以十进制 337135 调整。

Base-26使用数字(0-9,A-P)

使用此模式,您可以连接字符串并生成数字。

答案 1 :(得分:2)

这取决于每个值所需的大小。只有几个部门吗?一些运动代码?想想增长,并确保为此留出空间。

一种选择是为每个值生成唯一值,然后将它们组合在一起。您将每个值编号为INT,以便Sportcode“AA”= 1,“AB”= 2(假设这是您的格式),为您的分区编号,依此类推。然后,确定表达每个值所需的二进制位数:

  • 如果某个字段可以有16个不同的值,则该值需要4位。
  • 如果某个字段最多可包含256个差值,则该值需要8位。

一旦你知道每个位需要多少位,就可以将它们移位并将它们组合成一个数字。例如,如果上面的第一行以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,没有分裂