diff --git a/element.go b/element.go
index a2a84f36c5a7e98d37b6e395ad3f9687929848d1..4e02c13f71e23f1787251155c501c476d6d4fbe2 100644
--- a/element.go
+++ b/element.go
@@ -7,6 +7,7 @@ import "C"
 
 import (
 	"fmt"
+	"hash"
 	"math/big"
 	"runtime"
 )
@@ -21,6 +22,8 @@ type Element interface {
 	Set(Element) Element
 
 	SetFromHash([]byte) Element
+	SetFromStringHash(s string, h hash.Hash) Element
+
 	SetBytes([]byte) Element
 	SetXBytes([]byte) Element
 	SetCompressedBytes([]byte) Element
@@ -51,6 +54,7 @@ type Element interface {
 	Sign() int
 
 	Cmp(x Element) int
+	Equals(x Element) bool
 
 	Add(x, y Element) Element
 	Sub(x, y Element) Element
diff --git a/element_checked.go b/element_checked.go
index e35ba7e89664340576e9117bd403bf7529d5e8e8..e0c915bd541b958e063f32bbee538f2a0d5c7b83 100644
--- a/element_checked.go
+++ b/element_checked.go
@@ -5,7 +5,10 @@ package pbc
 */
 import "C"
 
-import "math/big"
+import (
+	"hash"
+	"math/big"
+)
 
 func (el *checkedElement) impl() *elementImpl { return &el.unchecked }
 
@@ -81,6 +84,11 @@ func (el *checkedElement) SetFromHash(hash []byte) Element {
 	return el
 }
 
+func (el *checkedElement) SetFromStringHash(s string, h hash.Hash) Element {
+	el.unchecked.SetFromStringHash(s, h)
+	return el
+}
+
 func (el *checkedElement) SetBytes(buf []byte) Element {
 	el.unchecked.SetBytes(buf)
 	return el
@@ -159,6 +167,8 @@ func (el *checkedElement) Cmp(x Element) int {
 	return el.unchecked.Cmp(x)
 }
 
+func (el *checkedElement) Equals(x Element) bool { return el.unchecked.Equals(x) }
+
 func (el *checkedElement) Add(x Element, y Element) Element {
 	el.checkAllCompatible(x, y)
 	el.unchecked.Add(x, y)
diff --git a/element_unchecked.go b/element_unchecked.go
index 1d4297199c348b331db74b40e9f39371409bc8d9..86757b3e7e864aa8a35081f4181122c146055d1a 100644
--- a/element_unchecked.go
+++ b/element_unchecked.go
@@ -6,6 +6,7 @@ package pbc
 import "C"
 
 import (
+	"hash"
 	"math/big"
 	"unsafe"
 )
@@ -49,6 +50,14 @@ func (el *elementImpl) SetFromHash(hash []byte) Element {
 	return el
 }
 
+func (el *elementImpl) SetFromStringHash(s string, h hash.Hash) Element {
+	h.Reset()
+	if _, err := h.Write([]byte(s)); err != nil {
+		panic(ErrHashFailure)
+	}
+	return el.SetFromHash(h.Sum([]byte{}))
+}
+
 func (el *elementImpl) SetBytes(buf []byte) Element {
 	C.element_from_bytes(el.data, (*C.uchar)(unsafe.Pointer(&buf[0])))
 	return el
@@ -171,6 +180,8 @@ func (el *elementImpl) Cmp(x Element) int {
 	return normalizeSign(int64(C.element_cmp(el.data, x.impl().data)))
 }
 
+func (el *elementImpl) Equals(x Element) bool { return el.Cmp(x) == 0 }
+
 func (el *elementImpl) Add(x, y Element) Element {
 	C.element_add(el.data, x.impl().data, y.impl().data)
 	return el
diff --git a/errors.go b/errors.go
index 5ae343dc835d6304732fda60384d5175cf40e81f..8ad9ad44216d52733b38f5fd00ba51c6114313ad 100644
--- a/errors.go
+++ b/errors.go
@@ -14,5 +14,6 @@ var (
 	ErrIllegalNil         = errors.New("received nil when non-nil was expected")
 	ErrOutOfRange         = errors.New("index out of range")
 	ErrEntropyFailure     = errors.New("error while reading from entropy source")
+	ErrHashFailure        = errors.New("error while hashing data")
 	ErrInternal           = errors.New("a severe internal error has lead to possible memory corruption")
 )