2014-12-27 63 views
2

該場景類似於此描述。Java String hashcode as Mysql ID

我已經爲用戶存儲典型的mysql表,當前,用戶ID是一個整數設置爲autoincrement。非常多的API rest接口與用戶別名(這是唯一的)一起工作來找到用戶,然後,我正在考慮用alias.hashcode()(這是一個整數)來實現用戶ID,以便每次都可以直接找到ID 。

用一個java String hashcode實現Mysql ID是個好主意嗎?會提升性能?

回答

3

我不認爲這是一個好主意。 pigeon hole principle狀態(來自維基百科)如果n物品被放入m貨櫃,而n > m,則至少一個貨櫃必須包含多於一個物品。基本上,你的解決方案不能處理碰撞,哈希很可能發生碰撞。

+0

謝謝,非常清楚。 – Dani 2014-12-27 20:36:04

+1

'「BB」.hashCode()==「Aa」.hashCode()'就是這種碰撞的一個簡單例子。 – fredoverflow 2014-12-27 22:45:07

3

不要使用String hashCode作爲您的ID,因爲它不是唯一的。兩個不同的字符串可能具有相同的hashCode。我假設你的ID應該是唯一的。

0

只需在別名列上添加索引,然後直接通過別名查詢數據庫。使用別名哈希碼或其他衍生品作爲id有兩個問題。首先,正如其他人指出的,哈希碼不是唯一的(這可以通過將id類型更改爲字符串,並使用摘要而不是哈希來解決。與摘要衝突,儘管仍然可能,但極不可能)。其次,如果用戶更改其別名,則該值將與該ID不同步。如果你的應用程序的功能是這樣的,這種情況不是不可能或不重要,那麼你根本不需要一個id,並且可以直接通過別名來識別用戶。

+1

是的,就是說,別名上的索引是我當前的設置。別名不能永遠不會改變。我認爲可以做我自己的「哈希碼」(引號中,因爲正如其他人指出的,「哈希」不一定是唯一的)。我需要實現這個由於其他原因,以更好的2n級緩存集成在幾個方面,例如...我一直在想這個。謝謝。 – Dani 2014-12-27 22:19:43