2014-10-01 44 views
0

我想將鏈接存儲在Firebase表中。我希望他們是獨一無二的。這些鏈接也會被其他表引用,所以我不希望在每次引用鏈接時都存儲鏈接的整個長URL字符串。我很難找到一種方法來強制鏈接的唯一性,同時使用相對較短的鍵來引用它們。如何有效存儲和引用Firebase中的長唯一字符串

例如,給出以下模式:

{ 
    "comments" : { 
    "-JYC6EkXz5DZt7s5jFMT" : { 
     "content" : "This is the first comment.", 
     "createdAt" : 1412190501922, 
     "link" : "http---testing-com-1-some-article", 
     "userId" : 0 
    }, 
    "-JYC6EmzCoKfYol1Ybyo" : { 
     "content" : "This is a reply to the first.", 
     "createdAt" : 1412190502079, 
     "link" : "http---testing-com-1-some-article", 
     "replyToCommentId" : "-JYC6EkXz5DZt7s5jFMT", 
     "userId" : 1 
    }, 
    "-JYC6Ep9lwdAwQbZmdYH" : { 
     "content" : "This is a reply to the second.", 
     "createdAt" : 1412190502218, 
     "link" : "http---testing-com-1-some-article", 
     "replyToCommentId" : "-JYC6EmzCoKfYol1Ybyo", 
     "userId" : 0 
    } 
    }, 
    "links" : { 
    "http---testing-com-1-some-article" : { 
     "comments" : { 
     "-JYC6EkXz5DZt7s5jFMT" : true, 
     "-JYC6EmzCoKfYol1Ybyo" : true, 
     "-JYC6Ep9lwdAwQbZmdYH" : true 
     }, 
     "createdAt" : 1412190501880, 
     "url" : "http://testing.com/1/some_article" 
    } 
    }, 
    "users" : [ { 
    "comments" : { 
     "-JYC6EkXz5DZt7s5jFMT" : true, 
     "-JYC6Ep9lwdAwQbZmdYH" : true 
    }, 
    "createdAt" : 1412190501881, 
    "name" : "Joe Blow" 
    }, { 
    "comments" : { 
     "-JYC6EmzCoKfYol1Ybyo" : true 
    }, 
    "createdAt" : 1412190501881, 
    "name" : "Jack Black" 
    } ] 
} 

正如你可以看到,每條評論必須包括其所屬的鏈接很關鍵。在保持唯一性的同時縮短這些密鑰有什麼好方法嗎?

+0

你也許可以在URL上做一個哈希來獲得更簡潔和合理的獨特性。或者在Firebase的某處保留一個計數器,並在每次需要新的值時抓取下一個值(當然,在「交易」內)。 – 2014-10-01 20:21:53

回答

1

你有存儲問題嗎?如果不是這樣,我不會因爲優化而麻煩你自己,因爲複雜性可能不值得感知(也可能是無形的)獎勵。

要回答這個問題,一個簡單而又萬無一失的方法就是給每個URL分配一個id並使用索引表進行查找。

var ref = new Firebase(URL); 
var indexRef = ref.child('url_index'); 

function assignId(url) { 
    var key = encodeURI(url); 
    // create a new, unique id 
    var uniqueId = indexRef.push().name(); 
    // store the id by URL 
    indexRef.child(key).set(uniqueId); 
} 

function lookupId(url, callback) { 
    var key = encodeURI(url); 
    indexRef.child(key).once('value', function(snap) { 
     // returns the unique id for this URL, or null if it does not exist yet 
     callback(snap.val()); 
    }); 
} 

更簡單的方法是爲每個URL創建一個唯一的哈希值並用它來存儲它們。這不是萬無一失的,但在人類使用規模(即記錄不到數十億)方面,這是非常獨特的。

這裏的好處是你不需要做網址查詢。你可以散列它來獲得它的密鑰,然後執行你想要的任何操作(包括檢查它是唯一的還是獲取實際的URL)。

// taken from: http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery 
function hashCode(string) { 
    var hash = 0, i, chr, len; 
    if (string.length == 0) return hash; 
    for (i = 0, len = string.length; i < len; i++) { 
    chr = string.charCodeAt(i); 
    hash = ((hash << 5) - hash) + chr; 
    hash |= 0; // Convert to 32bit integer 
    } 
    return hash; 
}; 

var ref = new Firebase(URL); 
var indexRef = ref.child('url_index'); 

function storeUrl(url) { 
    var key = hashCode(url); 
    // store the id by URL 
    indexRef.child(key).set(url); 
} 

function getUrl(key, callback) { 
    indexRef.child(key).once('value', function(snap) { 
     // returns the url for a given hash code 
     callback(snap.val()); 
    }); 
} 
+0

謝謝@ kato。我選擇使用鏈接ID的自動遞增計數器,以避免潛在的散列衝突。 – cayblood 2014-10-03 00:16:09

相關問題