Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] View of /sml/trunk/src/smlnj-lib/Util/hash-string.sml
ViewVC logotype

View of /sml/trunk/src/smlnj-lib/Util/hash-string.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1718 - (download) (annotate)
Thu Dec 2 22:48:18 2004 UTC (16 years, 3 months ago) by mblume
File size: 1015 byte(s)
minor modifications/improvements to hashing and atoms
(* hash-string.sml
 *
 * COPYRIGHT (c) 1992 by AT&T Bell Laboratories
 *)

structure HashString : sig

    val hashString  : string -> word
    val hashString' : substring -> word

end = struct

    fun charToWord c = Word.fromInt(Char.ord c)

  (* A function to hash a character.  The computation is:
   *
   *   h = 33 * h + 720 + c
   *)
    fun hashChar (c, h) = Word.<<(h, 0w5) + h + 0w720 + (charToWord c)

(* NOTE: another function we might try is h = 5*h + c, which is used
 * in STL.
 *)

    (* fun hashString s = CharVector.foldl hashChar 0w0 s *)
    local
	fun x + y = Word.toIntX (Word.+ (Word.fromInt x, Word.fromInt y))
	val sub = Unsafe.CharVector.sub
	fun hash (s, i0, e) =
	    let fun loop (h, i) =
		    if i >= e then h
		    else loop (hashChar (sub (s, i), h), i + 1)
	    in loop (0w0, i0)
	    end
    in
        fun hashString s = hash (s, 0, size s)
	fun hashString' ss =
	    let val (s, i0, len) = Substring.base ss
	    in hash (s, i0, i0 + len)
	    end
    end
end (* HashString *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0