【问题标题】:Same string but not the same at all相同的字符串但根本不一样
【发布时间】:2011-03-01 19:23:42
【问题描述】:

我同时使用 JAVA 和 PHP 进行编程。我在字符串比较方面遇到了一个问题。实际上,根据 JAVA,两个相同的字符串(在我看来)是不一样的。

问题背景:

我使用$userid_hash = sha1($row["profileId"].'helloworld'); 设置了一个cookie 连同$userid = $row["profileId"]。这样做是为了防止用户访问其他帐户。

现在的问题是我有一些用 JAVA 编写的服务器代码,它对 userid 进行哈希处理并将其与 userid_hash 进行比较。我在控制台中打印出来。两个字符串是相同的。

但问题是我已将其余代码包裹在 if 语句中,以防任何欺诈企图。根据我在 Eclipse 中的控制台,java 将字符串解释为不同,即使它们是不同的。这个问题的根源是什么?

我将其用作我的 SHA1 哈希 Syntax wrong with my SHA1 code。我使用"somestring".getBytes("UTF-8"); 调用它。我的 MySQL 数据库是 UTF-8 编码的,我在 Eclipse 中输入的任何字符串也是 UTF-8 编码的。我做错了什么?如何定位问题?

编辑:

这是比较之前java中的println语句:

ab968f939a4869339b5cdb611674bdf4954f2f6a ab968f939a4869339b5cdb611674bdf4954f2f6a

编辑:

如果语句:

if(packageName.toSHA1((profileId+"secret").getBytes("UTF-8")) == profileId_ver)

【问题讨论】:

  • 你的 if 语句是什么样的?您是否使用 equalsIgnoreCase 进行比较?
  • 您还没有共享任何代码,因此很难提供帮助。 “我有问题,有什么办法?”没有帮助...您是否正确比较了字符串?不要使用==,而是使用.equals()

标签: java string-comparison


【解决方案1】:

您是否使用 .equals() 而不是 ==? == 用于字符串测试它们在内存中的相同位置,而 .equals() 检查它们是否由相同的字符序列组成(这就是你想要的)。

好:

if(string1.equals(string2))

不好:

if(string1 == string2)

【讨论】:

  • 好的,现在可以了!但是为什么我不能使用==?如您所见,我是 JAVA 的新手。我还想知道 JAVA 中是否有一些等效的 PHP die() 函数?如果您不知道 PHP 中的 die() 函数,它会在调用该函数后停止编译。比我不必在大代码块周围加上大括号
  • == 不(总是)工作,因为它不是检查字符串是否由相同的字符序列组成,而是检查它们是否在内存中的相同位置(我不是完全确定为什么会这样……)。有时这会评估为 true - 如果您创建两个相同的字符串,Java 可能只会将第二个字符串作为对第一个字符串的引用,因此 == 将为 true(字符串是不可变的,因此这没有什么害处 - 如果一个字符串更改,它真的变成了一个新字符串)。但这确实意味着您需要 .equals() 允许的“深度”检查。
  • == 是 'object sameness' 如果 2 个引用指向同一个对象,则返回 true。 equals() 是逻辑等号——它让程序员在给定对象的情况下定义等号的含义。
  • 不是我推荐使用的。 :P
  • @thasc:一个简单的return; 与 PHP 中的 die() 相同,至少在实践中是这样
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多