在Java链码中使用getStateByRange(可能还有其他语言)时,搜索"asset10"通过"asset11"将检索asset10,以及任何在asset10之后的字符(例如asset100, asset101…)。
是否有任何字符或控制序列来防止这种情况,只是检索asset10?Unicode NULL和end of string似乎没有任何区别。
Hyperledger Fabric中的GetStateByRange方法按字典顺序对键执行搜索。搜索从指定的startKey(包括)开始,直到但不包括指定的endKey(不包括)。你也可以指定空字符串(""
)来创建一个无界搜索,它返回一个迭代器到所有具有基本键(不是组合键!)的资源。
在您的示例中,GetStateByRange("asset10", "asset11")检索诸如"asset10", "asset100", "asset101"等键,因为这种排序,因为它们属于由开始和结束键定义的范围内。
字典排序是指字符串中字符根据其ASCII值进行比较。例如,在ASCII中,"a"出现在"b", "出现在"之前,等等。因此,当使用GetStateByRange时,键按字典顺序排序,并且查询根据此顺序返回开始键和结束键之间的所有键。
在您的示例中,搜索比较"asset11"中的最后一个1。到第7个字符,即"asset10中的01";并确定它在字典顺序上更小,因此将其添加到返回列表中。
如果你只想接收asset10,你可以:
- Your startKey = "asset10">
- Your endkey = "asset100">
或者将endKey的最后一个字符设置为适合您需要的最小ASCII字符,也可以是"asset10!"例如,因为这将满足您的搜索条件。