字符串到唯一的int算法

时间:2011-09-27 19:05:06

标签: algorithm

我们正在努力实施以下案例。我们有一张发票表,并且有一个包含电子邮件地址的列。我们希望以某种方式从此电子邮件地址生成唯一的int值,并将其存储在单独的列中。这将用作FK并编制索引。所以我正在寻找的是一种从字符串生成整数的算法(请注意,电子邮件字符串应始终输出相同的int,因此每个电子邮件地址都作为唯一的int表示)。我们也可以使用bigint

4 个答案:

答案 0 :(得分:5)

最简单的解决方案是将电子邮件地址与identity / auto_increment类型列一起放入其自己的表中。然后你可以简单地携带那个标识字段(标准的int),并且你不会遇到潜在的哈希冲突的任何问题,也不会有散列开销。

答案 1 :(得分:1)

似乎一个简单的哈希码(MD5,SHA1,...)应该符合您的需求;根据您的RDBMS,您可能可以使用内置包(例如Oracle的dbms_crypto)或者必须在外部计算它们。

要记住的一些事情:

  • 在计算哈希码之前将所有内容转换为低/大写(因此USER@DOMAIN.COM获取与user@domain.com相同的哈希码)

  • 显然,你有一个非规范化的架构。拥有一个包含电子邮件地址的单独客户表会更有意义;然后,发票应仅包含外键customer_fk

答案 2 :(得分:0)

MD5 - 为您提供128位整数。 (不可否认,这比大多数语言中的int数据类型要大,但只有32位,你才能获得接近保证的唯一性。)

答案 3 :(得分:0)

我不知道你是否可以使用64位int:电子邮件地址的最大长度是254个字符,在这种情况下你需要保留每个字符的唯一性,散列不会这样做

所以看起来你不得不克服这个254个字符的障碍。我的方法(对我来说总是蛮力的方法)是在电子邮件地址中使用允许字符的字母表,将它们映射到6位值,并使用地图将它们打包成一系列单词。

查看rfc3696以实际可理解的方式处理电子邮件地址。

很抱歉得到这么少的帮助。