hashCode 等于 Integer.MIN_VALUE 的 Java 字符串

2024-01-20

是否存在 hashCode 完全等于 Integer.MIN_VALUE 的已知 Java 字符串?为哈希表编写测试有助于避免在执行余数运算之前在哈希码上运行 Math.Abs​​ 的常见错误。

理想情况下,该字符串仅包含 ASCII 字符,但我不确定它是否可行。


基于哈希码的公式(来自StringLatin1):

public static int hashCode(byte[] value) {
    int h = 0;
    for (byte v : value) {
        h = 31 * h + (v & 0xff);
    }
    return h;
}

它与字符线性相关,字符串越长、字符越大,哈希码就越大,直到溢出。另请注意,第一个字符具有更大的impact生成的哈希码(通常乘以 31)。

前两个算法的基本思想是从最左边的字符开始递增字符,直到哈希码变为负数,因为它具有更大的权重。搜索的字符串必须包含导致其在除最后一个位置之外的每个位置上溢出的字符之前的字符。

代码开始测试字符串"A", "AA", "AAA", ...直到开始返回负值 - 前一个字符串用作起始值。
现在它开始将第一个字符增加到Z或者直到找到具有负散列的字符串。对每个下一个角色执行相同的操作。 由于此类字符串的哈希码尚未达到Integer.MIN_VALUE,完成了一次额外的传递,以测试小写字符。这应该已经集成到之前的循环中......
现在最后一个字符是adjusted准确地到达Integer.MIN_VALUE- 简单,因为只是添加最后一个字符,无需乘法来计算哈希码。

这里是代码:

var string = "A";
while ((string+"A").hashCode() > 0) {
    string += "A";
}

var array = string.toCharArray();
var i = 0;
while (i < array.length) {
    array[i] += 1;
    if (array[i] > 'z' || new String(array).hashCode() < 0) {
        array[i] -= 1;
        i += 1;
        continue;
    }
}

i = 1;
while (i < array.length) {
    if (array[i] == 'Z') {
        array[i] = 'a';
    }else {
        array[i] += 1;
    }
    if (array[i] > 'Z' || new String(array).hashCode() < 0) {
        if (array[i] == 'a')
            array[i] = 'Z';
        else
            array[i] -= 1;
        i += 1;
        continue;
    }
}
int hash = new String(array).hashCode();
if (hash > 0) {
    array[array.length-1] += Integer.MAX_VALUE - hash + 1; 
}
System.out.printf("%s = %d%n", new String(array), new String(array).hashCode());

这导致:

HZcxf_ = -2147483648


合并前面代码的两个递增循环,我们有:

var string = "A";
while ((string+"A").hashCode() > 0) {
    string += "A";
}

var array = string.toCharArray();
var i = 0;
while (i < array.length) {
    var prev = array[i];
    if (prev == 'Z') {
        array[i] = 'a';
    } else {
        array[i] += 1;
    }
    if (array[i] > 'z' || new String(array).hashCode() < 0) {
        array[i] = prev;
        i += 1;
        continue;
    }
}
int hash = new String(array).hashCode();
if (hash > 0) {
    array[array.length-1] += Integer.MAX_VALUE - hash + 1; 
}
System.out.printf("%s = %d%n", new String(array), new String(array).hashCode());

结果(与之前略有不同):

HZdZG_ = -2147483648


另一种方法将更强烈地基于哈希计算,基本上撤销它。
由于我不想使用负数,所以它从Integer.MAX_VALUE,比Integer.MIN_VALUE(考虑上溢/下溢)。
首先它找出必须除以的频率31直到结果小于 128 (ASCII),即确定字符串长度。 接下来,它循环并通过一些特殊处理找出每个字符,以避免小于“”的字符。
最后,最后一个字符加一以将哈希码从MAX_VALUE to MIN_VALUE通过溢出。

var string = "";
var remain = Integer.MAX_VALUE;
var i = 0;
var multiplier = 1;
while (remain > 127) {
    remain /= 31;
    multiplier *= 31;
    i += 1;
}
remain = Integer.MAX_VALUE;
while (i >= 0) {
    var ch = (char)(remain / multiplier);
    remain -= ch * multiplier;
    multiplier /= 31;
    if (i > 0) {
        // correct if next ch will be less than ' '
        var correct = (' ' - (remain / multiplier) + 30) / 31;  // old fashion rounding
        if (correct > 0) {
            ch -= correct;
            remain += correct * 31 * multiplier;
        }
    } else {
        ch += 1;
    }
    string += ch;
    i -= 1;
}
System.out.printf("%s = %d%n", string, string.hashCode());

及其结果:

I='<*! = -2147483648


注意:如果哈希码算法为String改变了!前两个可能会失败,具体取决于哈希计算的更改方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hashCode 等于 Integer.MIN_VALUE 的 Java 字符串 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • Emacs 打字骨架对插入也许

    在 Eclipse 中 编辑 Java 代码时 如果我输入一个左括号 我会得到一对括号 如果我然后 输入 第二个括号 它不会插入额外的括号 我如何在 emacs 中得到它 Eclipse 编辑器足够聪明 当我输入闭括号时 它知道我刚刚完成了
  • 如何实现 Eclipse 清理和构建(又名重建)?

    我删除了我的 binEclipse Indigo 中的文件夹 与 Helios 非常相似 现在我想知道如何重建我的 Java 项目 我只是找不到像 Netbeans 中那样的按钮 对于 Eclipse 您可以在下面找到重建选项项目 gt 清
  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • 如何制作具有两个索引的 Map?

    我在java中有一张这样的地图 Map
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • java.io.IOException: EnsureRemaining: 仅剩余 0 个字节,尝试读取 1

    我在 giraph 中的自定义类方面遇到一些问题 我制作了 VertexInput 和 Output 格式 但总是收到以下错误 java io IOException ensureRemaining Only bytes remaining
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • IDEA:javac:源版本1.7需要目标版本1.7

    使用 IntelliJ IDEA 运行 JUnit 测试时 我得到 我该如何纠正这个问题 使用SDK 1 7 模块语言级别为1 7 Maven 构建工作正常 这就是为什么我相信IDEA配置问题 您很可能在此处从 Maven 导入了不正确的编
  • Spring Security登录返回404

    我目前正在使用 Spring 框架开发我的博客 我正在实现 Spring Security 用于登录目的 一切都按预期进行 直到我提交始终返回 404 代码的登录凭据 这是我的 web xml 代码e
  • 字节流和字符流

    请解释一下什么是字节流和字符流 这些究竟意味着什么 Microsoft Word 文档是面向字节的还是面向字符的 Thanks 流是一种顺序访问文件的方式 字节流逐字节访问文件 字节流适用于任何类型的文件 但不太适合文本文件 例如 如果文件
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • Hibernate SET 元素 order-by 子句

    我想知道 我可以平静地接受以下事实 当 fetch select 时 您可以在映射文件中的 SET 元素上设置 order by 属性 但如果您在创建查询时获取所有内容 这样安全吗 我的意思是 他们将结果放入 HashSet 中 我不认为这
  • 如何在 Struts 2 中访问 OGNL 跟踪评估?

    有人告诉我要优化网络应用程序 为此 我使用JProfiler https www ej technologies com products jprofiler overview html 我注意到很大一部分响应时间都花在了表示层上 特别是当
  • 使用 JPA 存储库保留 Spring Batch ItemWriter 的问题

    我对春季批次有疑问ItemWriter它依赖于 JPA 存储库来更新数据 这里是 Component public class MessagesDigestMailerItemWriter implements ItemWriter
  • 使用 Spark SQL 时找不到 Spark Logging 类

    我正在尝试用 Java 进行简单的 Spark SQL 编程 在程序中 我从 Cassandra 表获取数据 将RDD into a Dataset并显示数据 当我运行spark submit命令 我收到错误 java lang Class
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐

  • 用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP PDO 我可以将数组绑定到 IN 条件吗 https stackoverflow com questions 920353 php pdo can i bind an array to an
  • shell $@变量赋值和迭代

    function f for arg do echo arg done f hello world second arg 3rdarg 这工作正常 hello world second arg 3rdarg 但我什么时候分配 到某个变量 然
  • Android Oracle 数据库 JDBC6

    您好 我想创建到我的 Oracle 数据库的连接 我以前使用过 ojdbc14 jar 一切正常 但连接应该是安全的 我想加密文件 所以我决定现在使用ojdbc5 jar 该罐子是我的 libs 文件夹 从 jdbc14 更改为 jdbc6
  • .sink 没有从未来发布者返回承诺值

    我在 lrvViewModel swift 中有这段代码 func getVerificationID phoneNumber String gt Future
  • 访问php中函数返回的数组

    我正在使用一个模板引擎 它可以将代码插入到我的网站中我想要的位置 我编写了一个函数来测试一些非常简单的东西 myfunction return this gt data a b true false 问题是 this gt data 是私有
  • 如何在phonegap中创建toast?

    如何使用phonegap cordova在android应用程序中创建toast Thanx 首先创建一个ToastPlugin java package com company plugins import org apache cord
  • 如果我从不对打开的文件流调用“close”会发生什么? [复制]

    这个问题在这里已经有答案了 以下是同一案例的代码 include
  • qmake 中的 debug_and_release 配置功能有什么优点?

    我只能看到未来的一个优点 我们能够发行make all commad 好吧 我不打电话make在我的开发人员生命中的任何阶段 我使用 Qt Creator 当我构建项目时 我希望它严格作为调试或发布 我想这是人们预期的行为 But debu
  • 使用 r 中的 gsub 删除模式

    我有一根绳子Project Change Request PCR HONDA DIGITAL PLATEFORM保存在supp matches and supp matches1包含字符串Project Change Request PCR
  • 我想将一个表中的行分配到另一个表中的行,这些行可以在 SQL oracle 中占用相同数量的行

    我正在尝试编写一个 SQL 查询 它将记录从一个表分配到另一个具有相同数量的表 在这个例子中我有两个表 Students and Teachers 我想将学生分配给每位老师 学生 亚当 班尼特 埃尔默 贾斯汀 路易斯 诺亚 杰克 老师 Le
  • 将照片保存到 iPhone 照片库中的自定义相册

    我正在尝试在 iPhone 的照片库中创建一个自定义相册 然后将我用相机拍摄的照片或从手机相机胶卷中选择的照片保存到该自定义相册中 我可以成功创建相册 但照片没有保存在那里 而是保存到模拟器的 已保存照片 相册中 我不知道如何判断UIIma
  • 后递增运算符在 for 循环中不递增[重复]

    这个问题在这里已经有答案了 我正在做一些关于 Java 的研究 发现这非常令人困惑 for int i 0 i lt 10 i i System err print hoo 这是永无休止的循环 有人有很好的解释为什么会发生这样的事情吗 fo
  • NoneType 错误 self.widget.insert

    我试图在我的应用程序中拥有一个输出框架 当我运行它时 我收到错误 NoneType object has no attribute insert on self widget insert end string 任何帮助 将不胜感激 imp
  • 将多个数据帧导出到 .csv 文件中

    我想使用循环将多个数据帧作为单独的 csv 文件导出到工作目录 而不是写出所有名称 Sample data frame employee lt c John Doe Peter Gynn Jolie Hope salary lt c 210
  • Git-跟踪远程分支

    我是 Mercurial 用户 我对远程分支的行为感到困惑 我有一个远程分支origin dev 我想在本地分支上复制它dev 我想要的是 每当我git pull 更改为origin dev被合并到dev 每当我git push 更改为de
  • clang 如何引导 C/C++ 代码优化?

    有人告诉我 clang 是一个像 gcc 一样工作的驱动程序 可以进行预处理 编译和链接工作 在编译和链接过程中 据我所知 实际上是llvm进行了优化 O1 O2 O3 Os flto 但我就是无法理解howllvm参与其中 看来编译源代码
  • jQuery 多个选择器,获取哪个选择器触发事件

    当处理具有多个选择器的事件时 例如 item a another item a click function e 是否可以确定哪个父选择器触发了该事件 是吗 item or another item 谢谢你 由于选择器可以是任何东西 因此您
  • 量角器 e2e 抛出 webdriver 未定义

    我的量角器一直在运行 直到几天前我开始遇到 Using the selenium server at http localhost 4444 wd hub UNCAUGHT EXCEPTION Error connect ECONNREFU
  • 在 Haskell 中动态构建列表理解

    我很好奇是否可以在 Haskell 中动态构建列表理解 举个例子 如果我有以下内容 all pows a a b b a y b z y lt take a 0 z lt take b 0 我得到了我所追求的 Main gt List so
  • hashCode 等于 Integer.MIN_VALUE 的 Java 字符串

    是否存在 hashCode 完全等于 Integer MIN VALUE 的已知 Java 字符串 为哈希表编写测试有助于避免在执行余数运算之前在哈希码上运行 Math Abs 的常见错误 理想情况下 该字符串仅包含 ASCII 字符 但我