Hash Aerospike对UDF模块使用哪种哈希函数?

Hash Aerospike对UDF模块使用哪种哈希函数?,hash,user-defined-functions,aerospike,nosql,Hash,User Defined Functions,Aerospike,Nosql,Aerospike允许列出已加载的UDF模块。下面是一个aql-示例(): 显示模块 结果包含hash字段: aql> show modules +---------------------------+-------+------------------------+ | module | type | hash | +---------------------------+-------+----------

Aerospike允许列出已加载的UDF模块。下面是一个aql-示例():

显示模块
结果包含
hash
字段:

aql> show modules
+---------------------------+-------+------------------------+
| module                    | type  | hash                   |
+---------------------------+-------+------------------------+
| "example1.lua"            | "lua" | "033671e05067888fce09" |
| "example2.lua"            | "lua" | "07b42082cca8e73a96b2" |
+---------------------------+-------+------------------------+
2 rows in set (0.000 secs)
我的问题(1):我有
example1.lua
文件(UDF模块的源),如何计算(并检查)它的散列

我的假设:

  • 散列取决于源文件-TRUE
  • 哈希取决于加载的时间戳-失败
  • 散列取决于文件名-TRUE
  • 源文件上的md5sum-失败(显然,请参见假设3)
  • 纯源文件上的sha1sum-失败(见假设3)
  • 实际上,我想检查已注册模块的版本,并在必要时升级该模块。如文件中所述:

    文件的哈希值。大多数用户不会发现哈希值有用,但有些用户可能会使用它来验证服务器上UDF的版本或实例


    因此,备选问题(2)是:如何检查已注册UDF模块的版本?

    它是以下3个字段的20字节sha1哈希,表示为json文档。json文档是字符串表示,没有任何换行符或EOF字符

    "content64" : base64 encoding of whole file
    "type" : LUA
    "name" : filename
    
    例如:

    {"content64": "ZnVuY3Rpb24gcHJpbnRfbWV0YShyZWMpCgoJaWYgbm90IGFlcm9zcGlrZTpleGlzdHMocmVjKSB0aGVuCgkJcmV0dXJuICJub3JlYyIKCWVuZAoKCWluZm8ocmVjb3JkLnR0bChyZWMpKQoJaW5mbyhyZWNvcmQubGFzdF91cGRhdGVfdGltZShyZWMpKQoJcmV0dXJuIHJlY29yZC5sYXN0X3VwZGF0ZV90aW1lKHJlYykKZW5kCg==", "type": "LUA", "name": "lut.lua"}
    
    交叉检查:(忽略为echo命令而添加的“”转义字符)


    除了@sunil答案之外

    Python示例 此例程使用AeroSpike的UDF计算LUA模块的哈希值,该UDF是用python 3编写的

    导入base64
    导入hashlib
    #您可以传递一个参数-完整路径,然后提取
    #名字。但这里我们只有这种幼稚的实现
    def udf_module_get_hash(module_PATH,module_NAME_,不带DIR_,带EXT):
    打开(模块_路径,'rb')作为f:
    content=f.read()
    b64=base64.b64编码(内容)
    meta='{“content64”:“{0}”,“type”:“LUA”,“name”:“{1}”}”。格式(
    b64.解码('ascii'),
    模块名称不带目录,带扩展
    )
    sha1=hashlib.sha1()
    sha1.update(meta.encode())
    h=sha1.hexdigest()
    #h类似于“052ac7359e46d1c6c97a5bf1a9854739cd9e481a”
    返回h
    
    我在模块源snd上尝试了sha1,但它不匹配。我应该在计算散列之前加入文件名和模块内容吗?对不起,我之前的回答跳过了很多细节。请看更新的。
    $ echo -n {\"content64\": \"ZnVuY3Rpb24gcHJpbnRfbWV0YShyZWMpCgoJaWYgbm90IGFlcm9zcGlrZTpleGlzdHMocmVjKSB0aGVuCgkJcmV0dXJuICJub3JlYyIKCWVuZAoKCWluZm8ocmVjb3JkLnR0bChyZWMpKQoJaW5mbyhyZWNvcmQubGFzdF91cGRhdGVfdGltZShyZWMpKQoJcmV0dXJuIHJlY29yZC5sYXN0X3VwZGF0ZV90aW1lKHJlYykKZW5kCg==\", \"type\": \"LUA\", \"name\": \"lut.lua\"} | sha1sum 
    998354a59337b229e2dd777a3288e8e8f33568a5  -
    
    $ asinfo -v "udf-list"
    filename=lut.lua,hash=998354a59337b229e2dd777a3288e8e8f33568a5,type=LUA;