Add hash proc for cstrings (#5386)
This commit is contained in:
parent
6fa1dba515
commit
92665e6e9a
2 changed files with 15 additions and 1 deletions
|
|
@ -127,6 +127,15 @@ proc hash*(x: string): Hash =
|
|||
h = h !& ord(x[i])
|
||||
result = !$h
|
||||
|
||||
proc hash*(x: cstring): Hash =
|
||||
## efficient hashing of null-terminated strings
|
||||
var h: Hash = 0
|
||||
var i = 0
|
||||
while x[i] != 0.char:
|
||||
h = h !& ord(x[i])
|
||||
inc i
|
||||
result = !$h
|
||||
|
||||
proc hash*(sBuf: string, sPos, ePos: int): Hash =
|
||||
## efficient hashing of a string buffer, from starting
|
||||
## position `sPos` to ending position `ePos`
|
||||
|
|
@ -239,6 +248,7 @@ proc hash*[A](x: set[A]): Hash =
|
|||
|
||||
when isMainModule:
|
||||
doAssert( hash("aa bb aaaa1234") == hash("aa bb aaaa1234", 0, 13) )
|
||||
doAssert( hash("aa bb aaaa1234") == hash(cstring("aa bb aaaa1234")) )
|
||||
doAssert( hashIgnoreCase("aa bb aaaa1234") == hash("aa bb aaaa1234") )
|
||||
doAssert( hashIgnoreStyle("aa bb aaaa1234") == hashIgnoreCase("aa bb aaaa1234") )
|
||||
let xx = @['H','e','l','l','o']
|
||||
|
|
|
|||
|
|
@ -18,7 +18,11 @@ Changes affecting backwards compatibility
|
|||
- The IO routines now raise ``EOFError`` for the "end of file" condition.
|
||||
``EOFError`` is a subtype of ``IOError`` and so it's easier to distinguish
|
||||
between "error during read" and "error due to EOF".
|
||||
|
||||
- A hash procedure has been added for ``cstring`` type in ``hashes`` module.
|
||||
Previously, hash of a ``cstring`` would be calculated as a hash of the
|
||||
pointer. Now the hash is calculated from the contents of the string, assuming
|
||||
``cstring`` is a null-terminated string. Equal ``string``s and ``cstring``s
|
||||
produce equal hash value.
|
||||
|
||||
Library Additions
|
||||
-----------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue