我正在研究依赖伪半版本号(只使用主号,小号和补丁号)来索引文件的系统。
为了更快地进行比较和查找以及这样做的乐趣,我尝试计算数字"哈希"对于那些版本号。此数字哈希应具有以下属性(以下极端示例):
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 :(得分:0)
如果我理解正确,您尝试做的是将具有三个组件(按字典顺序排序)的版本号转换为单个自然数,以便保留订单。这不是一个哈希。
如果组件的大小存在上限,则这是微不足道的。只需使用大于最大组件值的乘数。
如果没有这样的上限,那是不可能的。考虑将0.1.0映射到数字N,然后必须将所有版本0.0.x映射到小N的数字,如果存在无限多个则不可能。