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])
|
h = h !& ord(x[i])
|
||||||
result = !$h
|
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 =
|
proc hash*(sBuf: string, sPos, ePos: int): Hash =
|
||||||
## efficient hashing of a string buffer, from starting
|
## efficient hashing of a string buffer, from starting
|
||||||
## position `sPos` to ending position `ePos`
|
## position `sPos` to ending position `ePos`
|
||||||
|
|
@ -239,6 +248,7 @@ proc hash*[A](x: set[A]): Hash =
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
doAssert( hash("aa bb aaaa1234") == hash("aa bb aaaa1234", 0, 13) )
|
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( hashIgnoreCase("aa bb aaaa1234") == hash("aa bb aaaa1234") )
|
||||||
doAssert( hashIgnoreStyle("aa bb aaaa1234") == hashIgnoreCase("aa bb aaaa1234") )
|
doAssert( hashIgnoreStyle("aa bb aaaa1234") == hashIgnoreCase("aa bb aaaa1234") )
|
||||||
let xx = @['H','e','l','l','o']
|
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.
|
- 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
|
``EOFError`` is a subtype of ``IOError`` and so it's easier to distinguish
|
||||||
between "error during read" and "error due to EOF".
|
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
|
Library Additions
|
||||||
-----------------
|
-----------------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue