从唯一字符串输入生成唯一ID

时间:2010-02-03 18:04:41

标签: java mysql uniqueidentifier

我有一个包含一列唯一字符串值的表。字符串值的最大长度为255个字符。我想生成一个唯一的id,字符串值作为输入。换句话说,我正在寻找一个字符串的紧凑表示。生成的唯一ID可以是字母数字。一个有用的功能是能够从唯一ID重新生成字符串值。

是否有一个有效的功能来生成这样一个唯一的id。某些方法可能使用校验和或散列函数。我想知道是否有标准的方法来做到这一点。

我正在使用MySql数据库和java。

谢谢!

- 编辑:我正在寻找一种更紧凑的表示,而不仅仅是使用字符串本身。

8 个答案:

答案 0 :(得分:4)

“独特”有多独特?使用任何良好的散列函数(MD5适用于大多数用途,并且可以通过java.security.MessageDigest.getInstance(“MD5”)轻松实现,可以使您获得一个非常非常可能是唯一的128位数字。哈希会为您提供较小的ID,并且碰撞的可能性更高。

在数据库中使用auto_increment字段,如果它适合您的设计,可能更容易实现,将真正保证唯一性,并将使用比16字节的MD5更小的ID。然后,您还可以满足通过密钥查找字符串的要求,而不能用于哈希。

答案 1 :(得分:2)

这与压缩有关。最简单的方法是进行bit-pack并将每个字符降低到最小的位数。

A-Z是26个字符,小于32(5位)

添加a-z并且它是6位(剩余大约12位模式以代表其他字符)。

让我们说这对你来说已经足够了。所以你有6x255位,这是1530位来存储你的字符串。 (191字节)

只使用大写字母会减少一点(到159字节)

您可以对其进行更多优化,但是您必须使用压缩算法,该算法需要字符串中的特定语言或模式,并优化这些模式。

除非您可以进一步指定字符串的内容,否则您将无法获得所需内容。抱歉。 (如果你能详细说明字符串的内容,那么就这样做。我们中的一个人可能会看到更好的模式“压缩”)

缺乏做你想做的事的能力是为什么哈希表太酷了。他们得到一个“非常独特”的数字,然后有第二级分辨率来测试两个字符串散列到相同数字的情况。

答案 2 :(得分:1)

如果您的数据库要求该列包含唯一值,那么为什么不使用该字符串本身?其他任何东西只是编码/解码它的另一个步骤。

答案 3 :(得分:1)

对于255长串而不是64位(或其他)长位数,你有更多的可能性。是不可能的。添加auto_increment字段。

答案 4 :(得分:1)

由于您使用的是MySQL,请查看CRC32

http://www.bitbybit.dk/carsten/blog/?p=191

答案 5 :(得分:0)

public String getUniqueId(String uniqueString) {
    return uniqueString;
}

除非ID对其有任何其他限制,否则“是唯一的”。

答案 6 :(得分:0)

如果频繁出现有限数量的字符串,则可以选择在主表中创建带有数字(自动增量)ID的引用表和FK到该引用表。

如果没有,如果需要检索原始文件,可以通过GZIP或任何其他压缩算法运行字符串。

如果您不需要检索原始内容,则可以使用MD5等哈希函数。

答案 7 :(得分:0)

选择合适的钥匙不应该很容易。

你需要考虑:

  • 复制: 是否需要在不同服务器之间共享密钥?如果是这样,你很可能需要某种独特的哈希或guid。

  • 表格大小/插页数量: 您应该考虑大多数rdbms按照其(群集)主键的顺序将数据物理地存储在硬盘驱动器上。现在想象一下,如果在具有合理大小的表上插入以'a'开头的哈希值,会发生什么。是的,theres索引填充,但最终它的完整和单行插入可以导致在硬盘上移动几GB。

  • 需要复制并拥有大表吗? 使用两者。使用主群集自动增量(长)整数键并在哈希列上定义唯一索引。