获取字符串的int表示形式
我正在寻找一种创建任意字母数字字符串的int \ long表示形式的方法。哈希代码不会这样做,因为我无法承受哈希冲突,即表示必须是唯一且可重复的。
数字表示将用于执行有效的(希望的)比较。数字键的创建将花费一些时间,但是只需要执行一次,而我需要对其进行大量的比较,这将有望比原始字符串进行比较要快得多。
关于更快的字符串比较的任何其他想法也将受到赞赏...
解决方案
回答
你的弦多久了?除非我们选择一个比字符串长的int表示形式,否则无论我们使用哪种转换,都将始终可能发生冲突。因此,如果我们使用的是32位整数,则只能唯一表示最多4个字节的字符串。
回答
我们不能仅从哈希码开始,如果哈希码匹配,是否逐字符进行比较?
回答
你的弦多大?任意长的字符串都不能压缩为32/64位格式。
回答
如果我们不想发生碰撞,请尝试使用SHA-512之类的疯狂工具。我不能保证不会发生碰撞,但是我认为它们尚未发现任何碰撞。
回答
假设"字母数字"表示字母和数字,则可以将每个字母/数字都视为基数为36的数字。不幸的是,大字符串会导致数字快速增长,因此我们不得不求助于效率不高的大整数。
如果在进行比较(即搜索特定的字符串)时字符串通常不同,则散列可能是最好的选择。一旦获得潜在的成功,就可以进行字符串比较以确保。精心设计的哈希将使冲突极为罕见。
回答
似乎MD5哈希可以正常工作。哈希冲突的风险极不可能发生。根据字符串的长度,生成int / long的哈希会很快遇到最大值问题。
回答
我们为什么不做类似1stChar +(10 x 2ndChar)+ 100 x(3rdChar)....的操作,在此我们使用每个字符的简单整数值,即a = 1,b = 2等,或者只是如果不是字母,则为整数值。这将为每个字符串提供唯一的值,即使对于两个相同字母但顺序不同的字符串也是如此。
当然,如果我们需要担心Unicode而不仅仅是担心ASCII会变得更加复杂,并且如果我们需要使用长字符串,则数字可能会很大。
标准的Java字符串比较功能肯定不够高效吗?
回答
弦多久了?如果它们很短,则可以通过将字符视为基数36(26 + 10)中的数字来生成唯一的ID,该数字形成n位数字,其中n是字符串的长度。另一方面,如果字符串足够短,则直接比较绝对不是问题。
否则,我们将必须生成无冲突的哈希,只有在事先知道完整的问题空间时(即,如果我们知道所有可能出现的字符串),才能完成此操作。我们将要看一下完美的哈希,尽管找到一个我知道的完美哈希函数的唯一可行算法是概率性的,所以从理论上讲冲突仍然是可能的。
可能还有其他方法可以找到这种功能。克努斯(Knuth)在TAoCP中称这为一个相当有趣的难题,但他也没有给出算法。
通常,我们提供的信息太少,无法找到不需要以某种方式探测整个问题空间的算法。这确实意味着问题的运行时间是指数级的,但可以使用机器学习启发式方法解决。我不确定这是否适合情况。
回答
可能:
String y = "oiu291981u39u192u3198u389u28u389u"; BigInteger bi = new BigInteger(y, 36); System.out.println(bi);
回答
一开始的几个问题:
- 我们是否测试过简单的字符串比较太慢?
- 比较的样子如何('ABC'=='abc'或者'ABC'!='abc')?
- 我们必须比较多少个字符串?
- 我们必须进行多少比较?
- 字符串看起来如何(长度,字母大小写)?
据我记得,Java中的String是一个对象,两个相同的字符串指向同一个对象。
因此,比较对象也许就足够了(可能已经以这种方式实现了字符串比较)。
如果这样做没有帮助,则当第一个元素为length时,我们可以尝试使用字符串对象的Pascal实现;如果字符串的长度不同,则可以节省一些CPU时间。
回答
除非字符串长度受限制,否则我们将无法避免冲突。
整数(2 ^ 32)有4294967296个可能的值。如果字符串包含4个以上的ASCII字符或者两个以上的unicode字符,则可能的字符串值多于可能的整数值。对于每个可能的5个字符串,我们不能有一个唯一的整数值。长值具有更多可能的值,但它们只会为每个可能的8个ASCII字符字符串提供唯一值。
哈希码可用于两个步骤:首先查看哈希码是否匹配,然后检查整个字符串。对于大多数不匹配的字符串,我们只需要执行第一步,这确实非常快。
回答
String length may vary, but let's say 10 characters for now.
在那种情况下,为了保证唯一性,我们必须使用某种大整数表示形式。我怀疑对大整数进行比较会比首先进行字符串比较快得多。我将在这里说其他人的意见,使用某种哈希,然后在哈希匹配的情况下检查原始字符串以清除所有冲突。
无论如何,如果字符串大约是10个字符,我怀疑比较一堆32位哈希值是否会比直接字符串比较快得多。我认为我们必须问自己,是否真的值得增加额外的复杂性。
回答
一天结束时,单个字母数字字符至少具有36个可能的值。如果包含标点符号,小写字母等,则可以轻松传递72个可能的值。
允许我们快速比较字符串的非冲突数字必然会随着字符串的长度呈指数增长。
因此,我们首先必须决定要比较的最长字符串。假设它的长度为N个字符,并且假设我们只需要大写字母和数字0-9,那么我们需要使用一个整数表示法,该整数可以高达
36 ^ N
对于长度为25(公用名字段)的字符串,我们最终需要一个130位的二进制数。
如果将其组合为32位数字,则需要4. 然后可以比较每个数字(与遍历字符串相比,四个整数比较无需花费时间)。我会建议使用大型数字库,但是对于这种特殊情况,我很确定我们可以编写自己的数据库并获得更好的性能。
如果要每个字符处理72个可能的值(大写,小写,数字,标点符号...),并且需要10个字符,则需要62位和2个32位整数(如果使用的是64位,则需要一个64位)支持64位计算的系统)
但是,如果我们不能限制字符串中的数字(即可以是256个字母/数字/字符/等中的任何一个)并且我们无法定义字符串的大小,则直接比较字符串是唯一的方法,但有一条捷径。
将字符串的指针强制转换为32位无符号整数数组,并一次将字符串比较4个字节(或者在64位处理器上一次比较64位/ 8字节)。这意味着一个100个字符串最多只需要25个比较就可以找到更大的一个。
我们可能需要重新定义字符集(并转换字符串),以便为优先级较高的字符分配接近0的值,为优先级较低的字符分配接近255的值(反之亦然,具体取决于我们如何比较它们) 。
祝你好运!
-亚当
回答
只要它是一个哈希函数,无论是String.hashCode(),MD5还是SHA1,除非对字符串的长度有固定的限制,否则冲突都是不可避免的。从无限组到有限组进行一对一的映射在数学上是不可能的。
退一步,避免碰撞是绝对必要的吗?