[20230919]黃金分隔法0.618.txt

lfree發表於2023-09-21

[20230919]黃金分隔法0.618.txt

--//許多人都知道黃金分隔點=0.618,如何計算得來估計許多人不知道,我大約記得讀初中時提到五邊形有關,至於如何算我自己也也忘記了.
--//實際上計算公式如下:
(sqrt(5)-1)/2

$ echo (sqrt(5)-1)/2| bc -l
.61803398874989484820

--//嘗試使用dc看看.
$ dc -e "20k 5 v 1 - 2 / p"
.61803398874989484820

--//實際上許多加密或者hash演算法會使用這個數字有關.

$ echo (sqrt(5)-1)/2*2^32 | bc -l
2654435769.49723029645788446720

--//取整2654435769 轉換16進位制:
--//2654435769 = 0x9e3779b9

$ echo "obase=16;2654435769" | bc
9E3779B9

$ dc -e "16 o 2654435769 pq"
9E3779B9

--//如果你上網查詢 9e3779b9 就可以找到許多類似介紹加密或者hash演算法的函式與這值有關.
--//已經離開學校太久太久,感覺許多基本的知識已經完全的還給老師..........也許用 用盡廢退 來比喻比較恰當.

--//也許大家會問,為什麼探究這個,前幾天看了連結: http://mvelikikh.blogspot.com/2023/04/computing-orahash.html
--//作者使用python語言,寫了一個oracle ora_hash函式的對應例子:
--//原始碼可以從如下地址獲得:

def ora_hash(data, max_bucket=0xffffffff, seed=0):
    if not data:
        return
    def uint32(n):
        return n & 0xffffffff
    def int_from_bytes(data):
        return int.from_bytes(data, 'little')
    def mix(data, final=False):
        nonlocal a, b, c, seed
        s7 = int_from_bytes(data[12:16])
        if final:
            s7 = uint32(s7 << 8)
        s0 = uint32(a + int_from_bytes(data[0:4]) + s7 + seed)
        if final:
            s0 = uint32(s0 + len_)
        s1 = s0 ^ s0>>7
        s2 = uint32(b + int_from_bytes(data[4:8]) + s1)
        s3 = uint32(s2 ^ s2<<0xd)
        s4 = uint32(c + int_from_bytes(data[8:12]) + s3)
        s5 = s4 ^ s4>>0x11
        s0 = uint32(s0 + s5 + s7 + seed)
        if final:
            s0 = uint32(s0 + len_)
        s6 = uint32(s0 ^ s0<<9)
        s1 = uint32(s1 + s2 + s6)
        s2 = s1 ^ s1>>3
        s3 = uint32(s2 + s3 + s4)
        a = uint32(s2 + s3)
        s3 = uint32(s3 ^ s3<<7)
        s0 = uint32(s0 + s3 + s5)
        b = uint32(s0 + s3)
        s0 = uint32(s0 ^ s0>>0xf)
        s1 = uint32(s0 + s1 + s6)
        c = uint32(s0 + s1)
        seed = uint32(s1 ^ s1<<0xb)
    a = b = c = 0x9e3779b9
    len_ = len(data)
    while len(data) >= 16:
        mix(data)
        data = data[16:]
    mix(data, final=True)
    return seed % (max_bucket + 1)

--//我在自己的機器上測試失敗,也許是python版本太低或者是自己不熟悉python的緣故,無法執行.如果仔細檢視裡面存在如下賦值語句:
--// a = b = c = 0x9e3779b9.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2985172/,如需轉載,請註明出處,否則將追究法律責任。

相關文章