Rumah >pembangunan bahagian belakang >Golang >Adakah terdapat fungsi sharding yang lebih baik untuk kunci int64 dalam golang?

Adakah terdapat fungsi sharding yang lebih baik untuk kunci int64 dalam golang?

PHPz
PHPzke hadapan
2024-02-05 22:54:11988semak imbas

golang 中 int64 键有更好的分片功能吗?

Kandungan soalan

Saya menggunakan peta serentak dari repositori ini, menyediakan fungsi sharding saya sendiri menggunakan kekunci newwithcustomshardingfunction 创建映射时可以选择键类型。我只需要为 int64, iaitu apa yang saya gunakan di sini.

Saya juga menggunakan versi terkini go ,我可以在其中使用泛型,因此我决定通过实现我自己的分片功能来使用 concurrent-map ,密钥为 int64 .

import (
    cmap "github.com/orcaman/concurrent-map/v2"
)

func shardingFunc(key int64) uint32 {
    return uint32(key) // TODO - create a better sharding function that does not rely on how uint32 type conversion works
}

func main() {
    testMap := cmap.NewWithCustomShardingFunction[int64, *definitions.CustomerProduct](shardingFunc)
    // ... use the map ...
}

Saya ingin tahu apa yang berlaku dengan fungsi sharding saya untuk int64 键是否可以,或者我应该有更好的分片功能吗?我不希望出现 index out of range ralat atau sebarang isu lain.


Jawapan yang betul


Fungsi sharding ialah fungsi hash. Fungsi ini harus mengagihkan kunci secara sama rata ke atas ruang 32-bit.

Jika empat bait bawah nilai init64 anda diagihkan sama rata, maka uint32(key) akan digunakan sebagai fungsi sharding.

uint32(key) 是一个错误选择的一个例子是低字节具有常量值。例如,如果键值类似于 0x00010000、0x00020000、...,则 uint32(key) Contoh pilihan yang tidak baik ialah apabila bait rendah mempunyai nilai tetap. Contohnya, jika nilai kunci adalah seperti 0x00010000, 0x00020000, ..., maka

akan dinilai kepada sifar. Ini bukan pengedaran seragam.

Jika anda tidak tahu bagaimana kunci int64 diedarkan, lebih baik gunakan semua bit kunci dalam fungsi sharding. Ini yang menggunakan xor: 🎜
func shardingFunc(key int64) uint32 {
    return uint32(key) ^ uint32(key >> 32) 
}

Atas ialah kandungan terperinci Adakah terdapat fungsi sharding yang lebih baik untuk kunci int64 dalam golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam