设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 紫苏
打印 上一主题 下一主题

[胡扯] 蛋疼数学程序帝!散列算法

 关闭 [复制链接]

Lv2.观梦者

旅之愚者

梦石
0
星屑
275
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

11
发表于 2010-8-27 12:45:18 | 只看该作者
内个,16384刚好可以用14位表示,@a和@b组成28位,剩下2位用来表示4个象限,紫苏大人这个问题的条件刚好是临界值,几乎是没有额外的算法了

然后做法就支持下小幽的吧   ——→其实手头没有参考资料

点评

moy
你们这是在晒技术XD 我自觉退散了  发表于 2010-8-28 01:17
(摇扇子笑)见小幽贴的点评  发表于 2010-8-27 13:36
这个条件太临界了,刚好30位才能容纳所有的x和y的可能组合  发表于 2010-8-27 12:53
看到这个才想起16384是14位的……就算带上符号位也不超orz  发表于 2010-8-27 12:50
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1185
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

12
发表于 2010-8-27 13:41:03 | 只看该作者
本帖最后由 DeathKing 于 2010-8-27 13:44 编辑

于是,考虑到了一种新的Hash生成方法,这个生成的Hash除了特殊值(Point0,0)以外是【对齐】的。特殊的,Point.new(0,0)返回0。并且在这个函数中,0被认为是正数。去掉了关于x和y长度的字段,因为之前算错了。{:nm_3:}

这个Hash有下面的结构
____________
ABJKLMNOPQRS

A => x的正负,可选值(1、2),特殊的,0视为正数
B => y的正负,可选值(1、2),特殊的,0视为正数
J、K、L、M、N、O、P 、Q、R、S=> 描述符,可选值(0、1、2、3、4、5、6、7、8、9)

算法:
1、求取A、B
2、求取abs_x、abs_y,并转化为字符串
3、填充abs_x、abs_y,直到取得字符串长度为5
4、使用嵌入表达式组合,并使用to_i方法转换

代码:
  1. def hash
  2.   return 0 if @x == 0 and @y == 0
  3.   str = ""
  4.   abs_x = @x.abs.to_s
  5.   abs_y = @y.abs.to_s
  6.   str << (@x >= 0 ? "1" : "2" )
  7.   str << (@y >= 0 ? "1" : "2" )
  8.   while abs_x.size < 5
  9.     abs_x = "0" + abs_x
  10.   end
  11.   while abs_y.size < 5
  12.     abs_y = "0" + abs_y
  13.   end
  14.   return "#{str}#{abs_x}#{abs_y}".to_i
  15. end
复制代码
毛hash个数: 2 * 2 * 2 * 2 * 10 ^ 8 = 1600000000
理论值应该和 2 ^ ( 15 * 2 ) 一样

点评

不错的思路,在顶楼假设的前提下足够了,只是生成的总是 Bignum,未免美中不足呢 可以继续思考能泛用于没有量值限制的 x、y 的散列函数  发表于 2010-8-27 15:17

评分

参与人数 1星屑 +240 收起 理由
紫苏 + 240

查看全部评分


See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

13
发表于 2010-8-27 16:49:38 | 只看该作者
  1. module ReisenRSA
  2.   class Reisen_RSA
  3.     def initialize(p, q)
  4.       @p = p
  5.       @q = q
  6.       get_data
  7.     end
  8.    
  9.     def get_data
  10.       @n = @p * @q
  11.       @t =(@p - 1) * (@q - 1)
  12.     end
  13.    
  14.     def get_d(e)
  15.       (1..99999).each do |i|
  16.         return i if i * e % @t == 1
  17.       end
  18.     end
  19.    
  20.     def pack(e, number)
  21.       @d = get_d(e)
  22.       @e = e
  23.       return number ** @d % @n
  24.     end
  25.    
  26.     def unpack(e, number)
  27.       if @e != e
  28.          @d = get_d(e)
  29.          @e = e
  30.        end
  31.       return number ** e % @n
  32.     end
  33.    
  34.   end
  35. end
复制代码
好吧,整数简单的 RSA 算法. 要求苛刻. 需要 q p 是质数,  e 要小于 t =(p- 1) * (q - 1). 先判断正负,取绝对值来计算.

点评

呵呵,还需要 e 不和 t 互质~不过这里我们需要的是两个域的散列码,你如何用 RSA 来生成呢(组合两个整数域 x、y 为一个 number 然后用 RSA 加密?)  发表于 2010-8-27 23:39

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

14
发表于 2010-8-27 16:52:54 | 只看该作者
如果是临时数据那直接用内存地址吧

点评

Pont.new(1, 1), Point.new(1, 1),这两个是内存地址不同的对象,但我们需要其散列码相同,呵呵  发表于 2010-8-27 23:40
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-7-28
帖子
310
15
发表于 2010-8-27 17:29:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
16
 楼主| 发表于 2010-8-28 00:22:31 | 只看该作者
回复 贝伦卡 的帖子

稀疏散列结构应该可以用链表实现(Google 的那个 sparsehash 似乎就是?),但确实有空时折衷的问题 o.o
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-7-28
帖子
310
17
发表于 2010-8-28 09:40:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

18
发表于 2010-8-28 13:25:22 | 只看该作者
本帖最后由 IamI 于 2010-8-29 09:12 编辑

一个糟糕的想法,一段糟糕的代码= =b 二进制变换摘要然后叠加
  1. # f:Defined Fixnum
  2. # return : 0b Array
  3. def turn(f)
  4.   #s = []
  5.   #begin
  6.   #  s.push f % 2
  7.   #  f = f / 2
  8.   #end until f == 0
  9.   #return s
  10.   s = sprintf("%#b", f)
  11.   a = s.scan(/./)
  12.   a.delete_at 0
  13.   a.delete_at 0
  14.   b = []
  15.   for i in a
  16.     b.push(i.to_i)
  17.   end
  18.   return b
  19. end
  20. # s:defined Array
  21. # return: zipped Fixnum
  22. def zip(s)
  23.   num = 0
  24.   begin
  25.       count = 1
  26.       l = s.pop
  27.       n = 0
  28.       loop do
  29.         break if count == 5
  30.         n = s.pop
  31.         break if n == nil
  32.         if l == n
  33.           count += 1
  34.         else
  35.           s.push(n)
  36.           break
  37.         end
  38.       end
  39.       num += (l * 5 + count - 1)
  40.       num *= 10
  41.   end until s == []
  42.   return num
  43. end

  44. x = 4001
  45. y = 2007
  46. hash = zip(turn(x)).to_s
  47. hash2 = zip(turn(y)).to_s
  48. puts (hash + “00” + hash2).to_i
  49.   
复制代码
另外,如果遇到0b101010101010101代码会超过Fixnum限定。下次想办法把01算成一位……= =b

点评

加了分割符00。应该不会有数字能摘要出00的吧……00会被变换成1.不过说实话现在我自己都有点搞不清楚了= =b  发表于 2010-8-29 09:14
那样的话只要有两组 x 和 y 的 hash 发生了上面说的那种情况,岂不是就产生了碰撞?  发表于 2010-8-29 08:57
不能保证。但是因为把所有字符(0-9)全部用完了所以我也很无奈(喂),固定顺移14位的话又显得太浪费了  发表于 2010-8-29 08:45
没细看,能保证 hash + hash2 永远是唯一的么?即不出现类似 hash 少最后一位,出现在 hash2 开头的情况,字符串串联后产生相同的 hash+hash2  发表于 2010-8-29 01:31
没细看,能保证 hash + hash2 永远是唯一的么?即不出现类似 hash 少最后一位,出现在 hash2 开头的情况,字符串串联后产生相同的 hash+hash2  发表于 2010-8-29 01:28

评分

参与人数 1星屑 +240 收起 理由
紫苏 + 240

查看全部评分

菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
19
发表于 2010-8-28 13:33:06 | 只看该作者
"是按照数的位数来位移么……粗略一想,位移量是变量的话,似乎难免碰撞吧?固定量 X 的位移可以保证高 X 位独立于低 X 位,而变量位移则无法保证"
那如果把位数记录下来呢?保留8位记录位数就能保证2^256范围内不会碰撞了。如果还不过那再用8位记录位数的位数,那么可以保证2^(2^256)位不会碰撞了= =这样可以无限逼近无限
From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
20
 楼主| 发表于 2010-8-29 01:31:58 | 只看该作者
回复 小幽的马甲 的帖子

没理解为什么要保留位来记录位数?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 00:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表