2016-01-14 195 views
0

我有很多用作HBase表中鍵的url。由於它們「全部」由http://開始,因此Hbase將它們放在同一個節點中。因此,我以+ 100%的節點結束,另一個空閒。將字符串轉換爲可逆的字符串,在Java中

所以,我需要將url映射到類似散列的東西,但是可逆的。在JAVA8中有沒有簡單,標準和快速的方法來做到這一點。

我尋找前綴的隨機(線性)分佈。

注:

  • 扭轉了自URL很多的URL與/ ? =和風險結束不平衡的分佈是不感興趣。

  • 我不需要加密,但我可以接受它。

  • 我不看壓縮,但令人欣慰的是如果可能的話:)

感謝, 海東青

+0

刪除HTTP://? –

+0

爲什麼不在保存前從網址中刪除協議,如果你真的需要,可以爲此添加另一列? 你不能顛倒散列。根本不是他們如何工作。 – Zhedar

+0

我必須保持網址完整。我知道一個哈希不是這個工作,我想像AES或ZIP之類的東西?謝謝:) – Costin

回答

3

這裏沒有一個單一的,標準的方式。

你可以做的一件事就是將密鑰加上其前綴。喜歡的東西:

a01cc0fe http://... 

這是很容易恢復(只需剪掉哈希字符,你可以是一個固定長度),將讓你很好的分佈。

字符串的散列碼在JVM之間是穩定和一致的。計算它的算法在String.hashCode's documentation中指定,所以您可以將它視爲String如何工作的合約的一部分。

+1

在所有JVM上,在所有機器上,字符串的哈希值是否相同?如果是這樣,它可能會完成這項工作。 – Costin

+0

是的;我會更新我的答案。 – yshavit

+0

我終於使用了這個想法。我已經通過了前2個字節從它的MD5爲前綴的網址中六。 hashCode()不適合用於平衡目的。謝謝。 – Costin

1

添加由36位十進制數[0-9a-z]編碼的哈希碼前綴。

public static String encode(String s) { 
    return Integer.toString(s.hashCode() & 0xffffff, 36) + "#" + s; 
} 

public static String decode(String s) { 
    return s.replaceFirst("^[^#]*#", ""); 
} 

樣品:

http://google.com/ <-> 5o07l#http://google.com/ 
+0

嗨,我用這個想法,但具有更好的散列(MD5的第一個字節)謝謝。 – Costin