The dirtiest solution: let to_array t = let a = Array.make (Hashtbl.length t) (Obj.magic 0) in ignore (Hashtbl.fold (fun k v i -> a.(i) <- (k, v); i + 1) t 0) ; a Does it work correctly for floats? Looks good for floats. # let to_array t = let a = Array.make (Hashtbl.length t) (Obj.magic 0) in ignore (Hashtbl.fold (fun k v i -> a.(i) <- (k, v); i + 1) t 0) ; a ;; val to_array : ('a, 'b) Hashtbl.t -> ('a * 'b) array = # let h = Hashtbl.create 0;; val h : ('_a, '_b) Hashtbl.t = # Hashtbl.add h 1.0 2.0;; - : unit = () # to_array h;; - : (float * float) array = [|(1., 2.)|] # Gc.compact ();; - : unit = () # BTW, the array should store a pointer to a tuple of two floats, so I thinkt float or ints doesn't matter. I won't use this solution, because it isn't better than others. Christoph Bauer