zeroieme 发表于 2017-8-21 14:37:25

Mathematica的HASH没附加参数时是什么算法啊

按帮助给的附加参数,会启动JAVA进程。本来想减少点麻烦就用默认算法,结果碰撞得一塌糊涂。
        "Adler32"        Adler 32 位循环冗余码校验
        "CRC32"        32 位循环冗余码校验
        "MD2"        128 位 MD2 编码
        "MD5"        128 位 MD5 编码
        "SHA"        160 位 SHA-1 编码
        "SHA256"        256 位 SHA 编码
        "SHA384"        384 位 SHA 编码
        "SHA512"        512 位 SHA 编码

wayne 发表于 2017-9-28 17:00:56

关于Hash函数,Mathematica文档没有说明默认的算法是啥。闭源的软件,没有文档明确说明的东西随时都会改动。版本之间不承诺兼容。

至于你说的碰撞的一塌糊涂 可否陈述一下具体的细节。

通过类似 ListPlot, {i, 1000}]] 的代码是否能看出问题?

wayne 发表于 2017-9-28 17:03:29

搜了下,stackoverflow的两篇答案,说明这个信息确实是缺失的。
https://stackoverflow.com/questions/4039538/what-is-the-default-hash-code-that-mathematica-uses
https://mathematica.stackexchange.com/questions/68954/default-behaviour-of-hashexpr-and-hashing-in-different-versions-of-mathematica

zeroieme 发表于 2017-9-28 19:28:29

wayne 发表于 2017-9-28 17:00
关于Hash函数,Mathematica文档没有说明默认的算法是啥。闭源的软件,没有文档明确说明的东西随时都会改动 ...

我要优化一个10G规模的代数式。各个“零件”就想用HASH命名,结果严重错误。排查最后发现是默认Hash的问题,改SHA-1就跑通了。
跑三晚两夜的程序,不想再跑一遍找那十对碰撞的代数式了。

wayne 发表于 2017-9-28 19:35:10

zeroieme 发表于 2017-9-28 19:28
我要优化一个10G规模的代数式。各个“零件”就想用HASH命名,结果严重错误。排查最后发现是默认Hash的问 ...

从上面的第二个链接看, hash在64位机器上默认使用了FNV-1方法。该hash方法实现非常容易。

https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function

=====================================================================
很好奇这么大的规模,怎么会想到用Mathematica来做

zeroieme 发表于 2017-9-28 19:44:09

wayne 发表于 2017-9-28 19:35
从上面的第二个链接看, hash在64位机器上默认使用了FNV-1方法。该hash方法实现非常容易。

https:// ...

积分啊,把RootSum初等化啊。慢慢就涨到这么大了。还好压缩回3M了。

-----
顺便问问,你试过树莓派集群吗?
页: [1]
查看完整版本: Mathematica的HASH没附加参数时是什么算法啊