English 中文(简体)
可以转换成整数的字符串的哈斯码
原标题:Hashcode for strings that can be converted to integer

我正在寻找最有效的方法 来为一个非常具体的字符串案例 创造大麻编码

我有可以转换成整数的字符串, 它们从1到10,000不等, 而且它们非常集中在1-600范围。

我的问题是,在从收藏中提取物品以实施大麻编码方面,什么是最有效的方法。

我所想的是:

  • 我可以将字符串转换成整数, 并使用直接的 ACE 表格( 10 000 行数组) - 这将非常快地检索, 但对于记忆分配来说并不聪明;

  • 我可以用这个字符串作为字符串,并获得一个大麻编码(我不必将其转换成整数,但我不知道就碰撞而言,大麻编码对字符串的效果如何)。

任何其他想法都非常感激。

多谢多谢

感谢各位迅速回复...

若我让大家知道我的最终目标, 我几乎不需要大麻餐桌!

我只想用一个无法改变的陈词典来验证一条溪流。我想检查一下我的信息中是否含有一个特定标签。

我会收到一个带几对标签=value的字符串。 我想验证该标签是否必须由我的应用程序处理 。

问题回答

您可能想要考虑三角( http:// en.wikipedia. org/ wiki/ Trie) 或 radex 树( http:// en.wikipedia. org/ wiki/ Radix_ tree ) 。 不需要将字符串分析成整数, 或者计算散列代码。 您在走弦时正在走树 。

编辑 :

在字符串上计算散列码和将整数从字符串中解析都涉及整个字符串行走,而THN则使用该值来查看特定的数据结构。其他技术可能涉及同时检查字符串 WHILE 穿行数据结构。这对要求“其他想法”的海报很有价值。

许多收藏( 例如 HashMap) 已经应用了补充“ rehash” 方法来帮助贫困的 hashcode 算法, 例如浏览 HashMap.hash () 的cource 代码。 字符串是非常常见的密钥, 这样您就可以确定 String. hashCode () 是高度优化的 。 SO, 除非您注意到您的 hashCodes 之间有许多碰撞, 否则, 我将使用标准代码 。

我尝试将 0. 600 的字符串放入一个 HashSet 中以查看发生了什么, 但看到有多少个条目相撞, 实在是太无聊了 。 自己看看! 如果您真的在乎, 请将 HashMap 中的源代码复制到自己的类中, 编辑它, 这样您就可以访问条目( 在 Java 6 源代码中, 我看着, 这将是 < code> Transientencle [] 表 , YMV ), 并添加计算碰撞的方法 。

如果只有有限的有效值范围, 为何不按您的建议将收藏作为 < code> int[ 10000] 表示? array[ x] 的值是 < code> x 发生的次数 。

如果您的字符串以十进制整数表示, 那么将其解析为字符串的是一个 5 度环绕( 最多 5 位数), 加上 和 减 数 。 也就是说, 它非常快 。 插入元素实际上是 O(1), 检索是 O(1) 。 需要的内存大约是 40 kb ( 每英寸4 字节 ) 。

一个问题是,插入令没有被保存,也许你不在乎。

也许您可以考虑缓存散列码, 并更新它, 如果您的收藏自上次 hashcode () 调用以来已有变化 。 见 < a href=" https:// stackoverflow.com/ questions/72229375/caching- hashes- in-java- recollations > > Caching hashes in Java 收藏?

“Insert despisioner saider of only doing this {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}只有你申请时的热点 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你才能证明这一点 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}

整数值本身将是一个完美的散列函数, 您不会遇到任何碰撞 。 但是这个方法有两个问题 :

  1. HashMap doesn t allow you to specify a custom hash function. So either you ll have to implement you own HashMap or you use a wrapper object.
  2. HashMap uses a bitwise and instead of a modulo operation to find the bucket. This obviously throws bits away since it s just a mask. java.util.HashMap.hash(int) tries to compensate for this but I have seen claims that this is not very successful. Again we re back to implementing your own HashMap.

在您重新使用整数作为散列函数后, 此点将您重新使用整数作为密钥, 为什么不使用整数作为密钥在 HashMap 中而不是字符串中? 如果您真的想要优化它, 您可以从 > int 中写入一个使用 < Integer 而不是 < a href=> 的散列键或使用 < a href=> http://trove4j. sourceforge. net/javadocs/gnu/trove/ map/hash/ TIntObjectHashMap. html" rel= "nofolve noreferr" > > 。

如果你真的有兴趣找到良好的散列函数,我可以建议