Convertir arbitraire Golang interface de tableau d'octets
Je suis en train d'écrire un hachage qui accepte tous les types de données. Une fois dans la fonction, j'traiter les données dans un tableau d'octets. Je vais avoir de la difficulté à trouver comment lancer un arbitraire interface{}
à un tableau d'octets.
J'ai essayé d'utiliser le paquet binaire, mais il semblait dépendre du type de données transmises. L'un des paramètres de la Write()
fn (docs) nécessaire de connaître l'ordre des octets du paramètre.
Tout type de données de tailles est un multiple d'un octet (même le bool), ce qui devrait être simple en théorie.
Code en question ci-dessous,
package bloom
import (
"encoding/gob"
"bytes"
)
//adapted from http://bretmulvey.com/hash/7.html
func ComputeHash(key interface{}) (uint, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(key)
if err != nil {
return 0, err
}
data := buf.Bytes()
var a, b, c uint
a, b = 0x9e3779b9, 0x9e3779b9
c = 0;
i := 0;
for i = 0; i < len(data)-12; {
a += uint(data[i+1] | data[i+2] << 8 | data[i+3] << 16 | data[i+4] << 24)
i += 4
b += uint(data[i+1] | data[i+2] << 8 | data[i+3] << 16 | data[i+4] << 24)
i += 4
c += uint(data[i+1] | data[i+2] << 8 | data[i+3] << 16 | data[i+4] << 24)
a, b, c = mix(a, b, c);
}
c += uint(len(data))
if i < len(data) {
a += uint(data[i])
i++
}
if i < len(data) {
a += uint(data[i] << 8)
i++
}
if i < len(data) {
a += uint(data[i] << 16)
i++
}
if i < len(data) {
a += uint(data[i] << 24)
i++
}
if i < len(data) {
b += uint(data[i])
i++
}
if i < len(data) {
b += uint(data[i] << 8)
i++
}
if i < len(data) {
b += uint(data[i] << 16)
i++
}
if i < len(data) {
b += uint(data[i] << 24)
i++
}
if i < len(data) {
c += uint(data[i] << 8)
i++
}
if i < len(data) {
c += uint(data[i] << 16)
i++
}
if i < len(data) {
c += uint(data[i] << 24)
i++
}
a, b, c = mix(a, b, c)
return c, nil
}
func mix(a, b, c uint) (uint, uint, uint){
a -= b; a -= c; a ^= (c>>13);
b -= c; b -= a; b ^= (a<<8);
c -= a; c -= b; c ^= (b>>13);
a -= b; a -= c; a ^= (c>>12);
b -= c; b -= a; b ^= (a<<16);
c -= a; c -= b; c ^= (b>>5);
a -= b; a -= c; a ^= (c>>3);
b -= c; b -= a; b ^= (a<<10);
c -= a; c -= b; c ^= (b>>15);
return a, b, c
}
- Que diriez-pkg "de l'encodage/la gueule"? Pouvez-vous l'utiliser?
- semble être au travail. Je l'ai essayé plus tôt, mais maintenant je me rends compte il y a une faiblesse dans la table de hachage sur de petites valeurs (0-62 sont identiques?). J'ai changé la plage, je travaillais avec tout ça semble maintenant au travail. Merci!
- corrigé les erreurs dans la table de hachage fn, mis à jour le code trouvé ici: gist.github.com/natebrennand/10442587
Vous devez vous connecter pour publier un commentaire.
D'autres problèmes dans mon code m'a conduit loin de la
gob
au début, il s'avère que c'était la bonne façon comme @nvcnvn suggéré. Code sur la façon de résoudre ce problème ci-dessous:Une autre façon de convertir
interface{}
à[]bytes
est d'utiliser un fmt paquet.de l'esf.Sprintf convertit l'interface de la valeur à la chaîne.
[]byte convertit la chaîne de valeur de l'octet.