擅长:python、mysql、java
<p>Oracle用它自己的内部格式表示数字,使用Oracle中的<code>dump()</code>函数可以看到这种格式。E、 g</p>
<pre><code>SELECT dump(123) FROM dual;
</code></pre>
<blockquote>
<pre><code>Typ=2 Len=3: 194,2,24
</code></pre>
</blockquote>
<p>因此,要想在Python中散列一个数字并得到与Oracle中相同的结果,您需要将Python数字转换为一组字节,就像Oracle在其内部进行的那样。在</p>
<p>对Oracle使用的内部逻辑的一个很好的分析可以在<a href="https://amitzil.wordpress.com/2015/03/24/how-are-numbers-saved-in-oracle/" rel="noreferrer">here</a>中找到。它是正确的,有一个小的遗漏与终止负数有关。另外,它是从从字节解码甲骨文数字的角度编写的。在我们的例子中,我们需要将一个Oracle数字编码为其内部字节格式。然而,我在形成这个答案时广泛地使用了它。在</p>
<p>下面的代码显示了一个Python函数<code>to_oracle_number()</code>,它将返回一个整数数组,该数组具有与Oracle数据库计算的数字相同的字节表示形式。它应该处理任何数字(正、负、分数、零等)。在</p>
<p>最底层的代码还显示了如何调用此函数并对其结果进行哈希处理以获得与Oracle数据库中计算的哈希值相同的哈希值,我相信这是您问题的核心。在</p>
<p>注意:该函数要求将要转换的数字作为字符串传入,以避免精度损失。在</p>
^{pr2}$
<h3>输出</h3>
<blockquote>
<pre><code>Typ=2 Len=3: 194,2,24
[194, 2, 24]
A0740C0829EC3314E5318E1F060266479AA31F8BBBC1868DA42B9E608F52A09F
</code></pre>
</blockquote>