如何解决功能哈希/指纹作为内置功能?
如何在运行时获取函数的稳定哈希?
这意味着如果实现更改,则哈希也将更改,并且这是递归的,因此,如果存在嵌套函数调用,则嵌套函数哈希将影响外部函数哈希。
不确定哪种语言具有此功能。我正在寻找一种实用而又微不足道的实用编程语言。
我猜想功能语言,也许是lisp或haskell是常见的猜想,但不确定这是什么样。
function myFunction() {
... // Some code,possibly using names from other files/modules/libraries
}
// Prints the hash which changes if anything in the implementation of `myFunction` changes,stable across runs.
print(hash(myFunction))
有这种语言吗?如果是这样,则需要一个有关如何编写它以及为什么起作用的示例。
非示例将是js,python,java ...
解决方法
我已经在用Common Lisp编写的商业应用程序中实现了此功能,并使用CCL(Clozure Common Lisp)进行了部署。
您可以通过使用disassemble
获得该函数的已编译图像的表示形式,然后使用适当的摘要(如Ironclad中的摘要)对其进行哈希处理来实现。
我在CCL解决方案中实际使用的是函数ccl::%function-code-words
,以获取函数中有多少个单词,访问器ccl::%function-code-byte
,以获取字节(是前者的四倍)。字数)。
显然,基于代码字节的哈希将无法反映在程序中同一时间在不同时间创建的函数实例之间捕获的词法环境之间的差异。
该实现不是递归的。而是,整个解决方案遍历了已知的功能列表。
,如果您想要通用的编程语言,Unison会无所不在地做到这一点:
每个Unison定义都是一棵语法树,然后通过以合并所有定义依赖项哈希值的方式对该树进行哈希处理,我们可以获得唯一标识该定义的Unison哈希。
每个Unison定义都由512-bit SHA3 hash标识,并且是不可变的-您不能修改定义,只能创建一个新定义。而且,名称与定义分开存储,因此重命名是一项微不足道的操作,如果两个人以结构化方式编写 ,但变量和函数名称不同,则他们的代码将共享相同的哈希,因此被标识为相同的代码。
对于配置语言,Dhall也可以:
使用Dhall对语义哈希的支持来确保许多类型的重构都可以保留行为
由于Dhall是非图灵完整的,所以每个表达式都具有正常形式,并且可以使用此正常形式的哈希来标识它,因此在重构Dhall代码时,您可以有力的保证它会产生相同的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。