Contents

ARST打卡第287周

lc3226_使两个整数相等的位更改次数 The Infinite-LST Future w/ FP Lee (Sanctum) Solana LST java迁移golang时rand库问题

Algorithm

lc3226_使两个整数相等的位更改次数

思路:

直接遍历32位整数,如果当前位不同,则计数器+1。

当然如果 n 的位为0,而 k 的位为1,则不可能相等,直接返回-1。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
impl Solution {
    pub fn min_changes(n: i32, k: i32) -> i32 {
        let mut cnt = 0;
        for i in 0..32 {
            if (n & (1 << i)) != (k & (1 << i)) {
                if (n & (1 << i)) == 0 {
                    return -1;
                }
                cnt += 1;
            }
        }
        cnt
    }
}

题解的位运算更快,因为题意知道 k 是 n 的二进制子集,有 n & k = k 否则为-1。

然后位异或得到差值,然后统计差值中1的个数。

1
2
3
4
5
6
7
8
impl Solution {
    pub fn min_changes(n: i32, k: i32) -> i32 {
        match n & k == k {
            true => (n ^ k).count_ones() as i32,
            false => -1,
        }
    }
}

Review

The Infinite-LST Future w/ FP Lee (Sanctum)

怕听不懂,开了英文字幕,但是尽量不看字幕去练习的。

这里是 Sanctum 联合创始人 FP Lee 的采访。

他认为多个池争来争去没意思,还是需要一个统一平台,打通不同的质押池。 并且不想像 Lido 取出要等14天,想提供直接取出的机制。

Lee 有趣地比喻了多个LST类比稳定币 USDT,USDC,说应该要 USDT,USDC 这类稳定币一样方便,而不应该太多障碍。

主持人问了一个好问题,如果长持sol的人,为啥要用LST而不是native stake。 Lee: LST比native stake没有任何方面的缺点,只有有点,还能defi,还能很快赎回。

Router: A_Sol(A_Sol) swap to B_Sol(B_LST). 自动化了多个 Stake account withdraw and deposite 等步骤。

因为这种 Sanctum 平台化的存在,而不是成为一个寡头或者让单一池做大过多,就没有像 ETH 的 Lido 一样导致中心化的危险,而更加去中心化,让 Solana 的 PoS 机制更加安全。

LS-NFT 确实挺好,比无脑抄的图片 NFT 有价值和意义多了,burn out 就相当于典当 LS-NFT 来换取回 SOL。 这些 LS-NFT 可以跟着 sol 一起升值,利好长期持有者。

如何应对死亡螺旋,因为币圈没有熔断机制,这种一般是巨大问题才会死亡螺旋,这种应该会基金会出来处理解决。

Tips

Solana LST

Share

java迁移golang时rand库问题

java的 Random 库是线程安全的(内部有锁),而golang的 math/rand 库不是线程安全的。

如果不加锁,可能 goroutine 并发时,会随机数生成过程导致 panic。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
panic: runtime error: index out of range [-2]

goroutine 53591696 [running]:
math/rand.(*rngSource).Uint64(...)
        /usr/local/go/src/math/rand/rng.go:249
math/rand.(*rngSource).Int63(0x1b10188?)
        /usr/local/go/src/math/rand/rng.go:234 +0x85
math/rand.(*Rand).Int63(...)
        /usr/local/go/src/math/rand/rand.go:96
# ...

所以java迁移golang时,需要给 math/rand 的使用 sync.Mutex 加锁。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

var (
	src  = rand.NewSource(time.Now().UnixNano())
	rng  = rand.New(src)
	lock sync.Mutex
)

func generateUniqueID() uint64 {
	lock.Lock()
	defer lock.Unlock()
	return rng.Uint64()
}

func Int63() int64 {
	lock.Lock()
	defer lock.Unlock()
	return rng.Int63()
}

func Intn(n int) int {
	lock.Lock()
	defer lock.Unlock()
	return rng.Intn(n)
}

func Float64() float64 {
	lock.Lock()
	defer lock.Unlock()
	return rng.Float64()
}