繁体   English   中英

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

[英]Generate unique id from unique string input

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

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

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

谢谢!

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

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

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

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

AZ是26个字符,小于32(5位)

添加az和它的6位(剩余大约12位模式代表其他字符)。

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

仅使用上限将减少一点(到159字节)

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

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

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

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

255个长字符串比64个(或其他)位长字符串有更多可能性。 是不可能的。 添加auto_increment字段。

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

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

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

你需要考虑:

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM