有沒有一種簡單的方法可以使用其哈希碼獲取字串的值?讓我解釋:
我有一個具有 value 的字串變數Hello Guys。它保存在這里:String@dye63g. 現在,我想Hello Guys從String@dye63g.
uj5u.com熱心網友回復:
根據您對這個問題的評論,您的問題確實是在問:
對于類不覆寫自身默認值的物件,我toString()可以java.lang.Object再次派生該值嗎?
答案是響亮的不。這不是 HASH。它是完全限定的類名,一個@符號,然后是十六進制數字(所以 0-9a-f,而不是你的示例中的 y 和 g),回傳的值是System.identityHashCode(obj).
此代碼與它的值完全沒有關系,也不是該物件的 hashCode。它通常是它的記憶體地址或對該原理的一些修改。
你可以簡單地測驗一下:
class Test {
public static void main(String[] args) {
System.out.println(System.identityHashCode("Hey, there!"));
}
}
運行幾次。可能會出現相同的值(這取決于您的系統和 VM impl),但現在在不同的 VM 或不同的計算機上運行相同的代碼,或者重新啟動并再次運行它。不同的值就出來了。這應該很明顯你不能。
第二個問題是鴿巢原則。該哈希值總是正好 32 位長(為什么?嗯,System.identityHashCode回傳 anint并且那些只有 32 位。每個字母(0-9a-f)代表 4 個位元組,因此為什么后面的東西@總是 8 個字符長:每個字符是 4 位,8*4 = 32。
你也可以測驗一下。將莎士比亞收集的作品復制/粘貼到一個巨大的字串中,現在呼叫identityHashCode它 - 它仍然只是一個短數字。
intan可以代表40 億個不同的數字,僅此而已。但是,可以想象的字串超過 40 億個(事實上,它們的數量是無限的)。因此,必須存在無限數量的不同字串,它們都恰好散列到 1234abcd。因此,給定散列 1234abcd,不可能說出它是由哪個字串產生的——畢竟,存在無限數量的散列到該值的字串。這是假設散列是“恒定的”(相同的字串會產生相同的散列,例如字串自己的.hashCode()方法會做什么)。System.identityHashCode甚至不是,實際上與實際值完全沒有關系。您獲得的數字實際上或多或少取決于啟動 JVM 時系統的記憶體負載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467309.html
下一篇:未能洗掉資料框中字串中的所有$
