2010-02-03 539 views
2

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

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

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

谢谢!

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

+2

数据库最简单的唯一ID是递增数字。 – Yada 2010-02-03 18:11:10

+0

为什么不使用UUID呢? https://stackoverflow.com/questions/192920/generating-a-globally-unique-identifier-in-java – Raedwald 2017-07-20 08:31:53

回答

4

“独特”有多独特?使用任何好的散列函数(对于大多数用途来说,MD5是体面的,并且可以通过java.security.MessageDigest.getInstance(“MD5”)轻松实现)可以获得一个非常可能是唯一的128位数字。如果它适合您的设计,可能会更容易实现,将真正保证唯一性,并将使用比ID更小的ID,而不是使用更小的ID 16位字节的MD5,你也可以通过密钥来满足你对字符串的查找要求,这是你不能做的一个哈希值

+0

我的用例不能使用auto_increment。 我喜欢使用MD5值作为id的想法。另外从@philfreo文章中发现,在MySQL中有一个MD5函数是很好的。我想这是可以的,我不能使用MD5哈希返回字符串。 – pkrish 2010-02-03 19:34:10

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

除非该ID对其有任何其他限制,而不是“唯一”。

+0

他说“一个紧凑的代表” - 可能是一个更短的版本。 – philfreo 2010-02-03 19:07:02

1

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

+0

我正在寻找更紧凑的代表。 – pkrish 2010-02-03 18:23:33

+0

@pkrish:好的,所以无损压缩一个字符串,所以你不需要显示完整的255个字符?你看过ZIP压缩吗? – FrustratedWithFormsDesigner 2010-02-03 18:38:20

1

对于长度为255的字符串,比64(或其他任何)位长的字符数多得多。是不可能的。添加一个auto_increment字段。

0

如果您经常发生的字符串数量有限,则可以选择在主表中创建一个带有数字(自动增量)ID和FK的引用表作为选项。

如果不是,您可以通过GZIP或任何其他压缩算法运行您的字符串,如果您需要检索原件。

如果您不需要检索原始文件,则可以使用散列函数(如MD5)来查找。

+0

压缩的问题在于,因为我将在ID中使用它,所以我希望这是人类可读的。所以可能是一个好的散列函数,就像MD5一样。 – pkrish 2010-02-03 19:46:31

2

这与压缩有关,最简单的方法是比特包并将每个字符降至最低位数。

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

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

假设这对你已经足够了。所以你有6×255位,这是1530位来存储你的字符串。(191个字节)

只盖去将减少一点(159字节)

您可以更优化它,但你必须进入一个期望有特定的语言或图案的压缩算法字符串并优化这些模式。

除非你可以进一步指定字符串的内容,否则你只是不会得到你想要的。抱歉。 (如果你可以告诉更多关于字符串的内容,那么这样做吧,我们其中一个人可能会看到模式会让你更好“压缩”)

这种缺乏能力去做你想做的事情是为什么hashtables非常酷。他们得到一个“大部分唯一”的数字,然后有第二级解析来测试两个字符串散列到相同数字的情况。

0

选择适当的键不应该采取简单。

你需要考虑:

  • 复制: 需要共享不同服务器之间的键?如果是这样,你很可能需要某种独特的散列或指导。

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

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