diff --git a/graph/mongo/iterator.go b/graph/mongo/iterator.go index 9e37089..0c54910 100644 --- a/graph/mongo/iterator.go +++ b/graph/mongo/iterator.go @@ -185,13 +185,13 @@ func (it *Iterator) Contains(v graph.Value) bool { case quad.Subject: offset = 0 case quad.Predicate: - offset = (it.qs.hasher.Size() * 2) + offset = (it.qs.hasher_size * 2) case quad.Object: - offset = (it.qs.hasher.Size() * 2) * 2 + offset = (it.qs.hasher_size * 2) * 2 case quad.Label: - offset = (it.qs.hasher.Size() * 2) * 3 + offset = (it.qs.hasher_size * 2) * 3 } - val := v.(string)[offset : it.qs.hasher.Size()*2+offset] + val := v.(string)[offset : it.qs.hasher_size*2+offset] if val == it.hash { it.result = v return graph.ContainsLogOut(it, v, true) diff --git a/graph/mongo/triplestore.go b/graph/mongo/triplestore.go index 364d195..9df314d 100644 --- a/graph/mongo/triplestore.go +++ b/graph/mongo/triplestore.go @@ -39,10 +39,11 @@ var _ graph.BulkLoader = (*TripleStore)(nil) const DefaultDBName = "cayley" type TripleStore struct { - session *mgo.Session - db *mgo.Database - hasher hash.Hash - idCache *IDLru + session *mgo.Session + db *mgo.Database + hasher_size int + make_hasher func() hash.Hash + idCache *IDLru } func createNewMongoGraph(addr string, options graph.Options) error { @@ -86,24 +87,26 @@ func newTripleStore(addr string, options graph.Options) (graph.TripleStore, erro } qs.db = conn.DB(dbName) qs.session = conn - qs.hasher = sha1.New() + qs.hasher_size = sha1.Size + qs.make_hasher = func() hash.Hash { return sha1.New() } qs.idCache = NewIDLru(1 << 16) return &qs, nil } func (qs *TripleStore) getIdForTriple(t quad.Quad) string { - id := qs.ConvertStringToByteHash(t.Subject) - id += qs.ConvertStringToByteHash(t.Predicate) - id += qs.ConvertStringToByteHash(t.Object) - id += qs.ConvertStringToByteHash(t.Label) + hasher := qs.make_hasher() + id := qs.convertStringToByteHash(t.Subject, hasher) + id += qs.convertStringToByteHash(t.Predicate, hasher) + id += qs.convertStringToByteHash(t.Object, hasher) + id += qs.convertStringToByteHash(t.Label, hasher) return id } -func (qs *TripleStore) ConvertStringToByteHash(s string) string { - qs.hasher.Reset() - key := make([]byte, 0, qs.hasher.Size()) - qs.hasher.Write([]byte(s)) - key = qs.hasher.Sum(key) +func (qs *TripleStore) convertStringToByteHash(s string, hasher hash.Hash) string { + hasher.Reset() + key := make([]byte, 0, qs.hasher_size) + hasher.Write([]byte(s)) + key = hasher.Sum(key) return hex.EncodeToString(key) } @@ -243,7 +246,8 @@ func (qs *TripleStore) TriplesAllIterator() graph.Iterator { } func (qs *TripleStore) ValueOf(s string) graph.Value { - return qs.ConvertStringToByteHash(s) + h := qs.make_hasher() + return qs.convertStringToByteHash(s, h) } func (qs *TripleStore) NameOf(v graph.Value) string { @@ -288,13 +292,13 @@ func (qs *TripleStore) TripleDirection(in graph.Value, d quad.Direction) graph.V case quad.Subject: offset = 0 case quad.Predicate: - offset = (qs.hasher.Size() * 2) + offset = (qs.hasher_size * 2) case quad.Object: - offset = (qs.hasher.Size() * 2) * 2 + offset = (qs.hasher_size * 2) * 2 case quad.Label: - offset = (qs.hasher.Size() * 2) * 3 + offset = (qs.hasher_size * 2) * 3 } - val := in.(string)[offset : qs.hasher.Size()*2+offset] + val := in.(string)[offset : qs.hasher_size*2+offset] return val }