我正在寻找一种方法来创建任意字母数字字符串的int\long表示.哈希代码不会这样做,因为我无法承受哈希冲突,即表示必须是唯一且可重复的.
数字表示将用于执行有效(希望)比较.创建数字键需要一些时间,但它只需要发生一次,而我需要对它进行大量的比较 - 这有望比比较原始字符串快得多.
关于更快的字符串比较的任何其他想法也将非常受欢迎...
除非你的字符串长度有限,否则你无法避免碰撞.
整数(2 ^ 32)有4294967296个可能的值.如果您的字符串包含4个以上的ASCII字符或两个以上的unicode字符,则可能的字符串值可能超过可能的整数值.每个可能的5个字符串都不能有唯一的整数值.长值具有更多可能的值,但它们仅为每个可能的8个ASCII字符串提供唯一值.
哈希代码作为两个步骤非常有用:首先查看哈希代码是否匹配,然后检查整个字符串.对于大多数不匹配的字符串,您只需要执行第一步,而且速度非常快.
你不能只用哈希码开始,如果哈希码匹配,做一个逐字符比较?
琴弦有多长?如果它们非常短,则可以通过将字符视为基数36(26 + 10)中的数字来生成唯一ID,其形成n数字编号,其中n是字符串的长度.另一方面,如果字符串足够短以允许这样做,那么直接比较也不会成为问题.
否则,您将不得不生成无冲突的哈希,这只能在事先知道完整的问题空间时才能完成(即,如果您知道可能发生的所有字符串).你会想要看一下完美的散列,尽管找到一个我知道的完美散列函数的唯一可行算法是概率性的,所以碰撞在理论上仍然是可能的.
可能还有其他方法可以找到这样的功能.Knuth称这在TAoCP中是一个"相当有趣......难题",但他也没有给出算法.
通常,您提供的信息太少,无法找到不需要以某种方式探测整个问题空间的算法.这确实意味着问题具有指数运行时间,但可以使用机器学习启发式解决.我不确定你的情况是否合适.