2016-08-19 35 views
0

我正在依靠僞semver版本號(僅使用主要,次要和補丁號)來索引文件。Semver的數字和可訂購hashsum

爲了更快的比較和查找以及這樣做的樂趣,我試圖爲這些版本號計算一個數字「哈希」。這個數字哈希應具有以下特性(以下極端的例子):

Hash(1.0.500) < Hash(1.1.0) < Hash(1.3000.0) < Hash(2.0.0) 

我已經嘗試了多種解決方案一樣加權每個位置或類似這樣的

int hash = 17; 
hash = hash * 42 + Major; 
hash = hash * 42 + Minor; 
hash = hash * 42 + Patch; 

這些但這一切可以快速到達極限(乘數或重量以下),其中

Hash(1.0.1500) > Hash(1.1.0) 

我可以選擇一個骯髒的方式,去一個大的乘數,以避免這種碰撞(並確保組合的最小數量),但我更願意選擇清潔路徑

這甚至可能嗎?

+0

是否對索引的每個部分都有任何大小限制? – kaushik

+0

我想避免引入大小限制,但關於亨利的迴應,我認爲我必須去 – Binary9

回答

0

如果我理解正確,那麼您嘗試的做法是將包含三個組件(按字典順序排列)的版本號轉換爲單個自然數,以便保留順序。這不是一個散列。

如果存在組件大小的上限,這很重要。只需使用大於最大分量值的乘法器。

如果不存在這樣的上限,則不可能。考慮將0.1.0映射到數字N,那麼所有版本0.0.x都必須映射到小於N的數字,如果它們中有無限多個,則這是不可能的。

+0

這就是我想的,我的另一個想法是使用整個組或多個版本來找出multiplicator,它也是任何稍後添加到組中的版本可能會破壞邏輯。 我知道這不是純粹意義上的散列(這就是爲什麼它被引號包圍):)。無論如何感謝您的答案 – Binary9