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