我有一个包含一列唯一字符串值的表。字符串值的最大长度为255个字符。我想生成一个唯一的id,字符串值作为输入。换句话说,我正在寻找一个字符串的紧凑表示。生成的唯一ID可以是字母数字。一个有用的功能是能够从唯一ID重新生成字符串值。
是否有一个有效的功能来生成这样一个唯一的id。某些方法可能使用校验和或散列函数。我想知道是否有标准的方法来做到这一点。
我正在使用MySql数据库和java。
谢谢!
- 编辑:我正在寻找一种更紧凑的表示,而不仅仅是使用字符串本身。
答案 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
答案 5 :(得分:0)
public String getUniqueId(String uniqueString) {
return uniqueString;
}
除非ID对其有任何其他限制,否则“是唯一的”。
答案 6 :(得分:0)
如果频繁出现有限数量的字符串,则可以选择在主表中创建带有数字(自动增量)ID的引用表和FK到该引用表。
如果没有,如果需要检索原始文件,可以通过GZIP或任何其他压缩算法运行字符串。
如果您不需要检索原始内容,则可以使用MD5等哈希函数。
答案 7 :(得分:0)
选择合适的钥匙不应该很容易。
你需要考虑:
复制: 是否需要在不同服务器之间共享密钥?如果是这样,你很可能需要某种独特的哈希或guid。
表格大小/插页数量: 您应该考虑大多数rdbms按照其(群集)主键的顺序将数据物理地存储在硬盘驱动器上。现在想象一下,如果在具有合理大小的表上插入以'a'开头的哈希值,会发生什么。是的,theres索引填充,但最终它的完整和单行插入可以导致在硬盘上移动几GB。
需要复制并拥有大表吗? 使用两者。使用主群集自动增量(长)整数键并在哈希列上定义唯一索引。