mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 20:17:42 +00:00
Add hash proc for cstrings (#5386)
This commit is contained in:
committed by
Andreas Rumpf
parent
6fa1dba515
commit
92665e6e9a
@@ -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
|
||||
-----------------
|
||||
|
||||
Reference in New Issue
Block a user