Semver 的数字和可排序哈希和
Numeric and orderable hashsum of a Semver
我正在开发一个依赖伪 semver 版本号(仅使用主要、次要和补丁号)来索引文件的系统。
为了更快地进行比较和查找并从中获得乐趣,我正在尝试为这些版本号计算一个数字 "hash"。此数字哈希应具有以下 属性(以下极端示例):
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.1.0 映射到数字 N,那么所有版本 0.0.x 必须映射到更小 N 的数字,如果它们有无限多,这是不可能的。
我正在开发一个依赖伪 semver 版本号(仅使用主要、次要和补丁号)来索引文件的系统。
为了更快地进行比较和查找并从中获得乐趣,我正在尝试为这些版本号计算一个数字 "hash"。此数字哈希应具有以下 属性(以下极端示例):
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.1.0 映射到数字 N,那么所有版本 0.0.x 必须映射到更小 N 的数字,如果它们有无限多,这是不可能的。