2014-04-09 55 views
1

我在Python中为给定的string生成ID类型integer挣扎了一下。从Python中的字符串生成ID

我认为它的内置hash功能是完美的,但它似乎有时候ID太长。这是一个问题,因为我将最大长度限制在64位。

我的代码到目前为止:hash(s) % 10000000000。 我期望的输入字符串将在12-512个字符的范围内。

的要求是:只能从提供的字符串生成

  • 理想可达10-12个字符长

    • 整数(我只〜500万个产品)
    • 的概率低碰撞..?

    我会很高兴,如果有人可以提供任何提示/解决方案。

  • 回答

    0

    我会做这样的事情:

    >>> import hashlib 
    >>> m = hashlib.md5() 
    >>> m.update("some string") 
    >>> str(int(m.hexdigest(), 16))[0:12] 
    '120665287271' 
    

    的想法:

    1. 计算与MD5(或SHA-1或...)以十六进制形式的字符串的哈希值(见模块hashlib
    2. 将字符串转换为整数并将其重新转换为基数为10的字符串(结果中只有数字)
    3. 使用s的前12个字符特林。

    如果字符a-f也可以,我会做m.hexdigest()[0:12]

    +0

    谢谢,它看起来不错!它不返回整数,但它只是将其重新转换为int。如果我们可以用int/str/int coerce舞蹈离开,会很好。任何想法? :) – mlen108

    +0

    m.hexdigit()提供一个32个字符的字符串。所以最大值是'''f'* 32'',有39个数字(=''len(str(int('f'* 32,16)))'')。所以你最后可以分1E17。有了这个解决方案,碰撞可能更可能......但我没有想到它...... –

    +0

    m.hexdigit()提供了m.digest_size * 2个字符(这可能会改变,这取决于希望使用的散列函数) –